2010-10-19 49 views
2

停止我的网络应用程序后,大量的PermGen未被释放。罪魁祸首似乎是WebappClassLoader(在Tomcat中,但它也发生在Jetty中),它由一堆其他对象的引用保存在内存中。下图显示了引用WebappClassLoader的对象以及引用它们的内容等等。是否可以阻止java.util.logging导致内存泄漏?

alt text

其中一个紧贴对象似乎是net.lag.logging.Level$INFO$一个实例中,向其中一个参考存储在静态known阵列中java.util.logging.Level

看来,java.util.logging.Level保持对其自身的所有实例的静态引用。坏,讨厌java.util.logging.Level!我能做些什么吗? java.util.logging框架被第三方库使用,所以我认为我没有选择不使用它。

+0

单位是什么字节?日志记录占用8个字节,你担心它吗? – bwawok 2010-10-19 02:21:03

+0

是的,它是字节,不,我不关心8字节。我关心的是,对WebappClassLoader的引用会阻止它被垃圾收集;它占了大约10兆字节。 – David 2010-10-19 02:23:17

+0

您正在使用哪种JVM? – 2010-10-19 02:31:47

回答

2

为了让Sun修复Level实现或更改您的库以废除自定义级别,我能想到的唯一方法是将库从Web应用程序类加载器移出并放入容器(共享或通用类加载器)。

如果您这样做,仍然会有Level的自定义实例,但它们将不再链接到Web应用程序。所以如果你反弹webapp,它会继续回收相同的级别(不会泄漏新的)。

当然,这会影响库的类加载器,并且可能会中断。有些东西需要在Web应用程序中,并且不能移动到容器中。即使图书馆继续工作,它本身也可能保留与Web应用程序其他部分相似的引用,这又会是完全相同的问题。不过,试试吧。

+1

有关错误报告,请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6543126。 – Gili 2012-05-31 23:13:28