我可以阻止java.util.logging导致内存泄漏吗?

我可以阻止java.util.logging导致内存泄漏吗?,java,web-applications,memory-leaks,java.util.logging,Java,Web Applications,Memory Leaks,Java.util.logging,在停止我的web应用程序后,大量PermGen没有发布。罪魁祸首似乎是WebappClassLoader(在Tomcat中,但它也发生在Jetty中),它通过一堆其他对象的引用保存在内存中。下图显示了引用WebappClassLoader的对象,以及引用它们的对象,等等 其中一个粘滞对象似乎是net.lag.logging.Level$INFO$的实例,其引用存储在java.util.logging.Level中的静态known数组中 似乎java.util.logging.Level保留了对

在停止我的web应用程序后,大量PermGen没有发布。罪魁祸首似乎是WebappClassLoader(在Tomcat中,但它也发生在Jetty中),它通过一堆其他对象的引用保存在内存中。下图显示了引用WebappClassLoader的对象,以及引用它们的对象,等等

其中一个粘滞对象似乎是
net.lag.logging.Level$INFO$
的实例,其引用存储在
java.util.logging.Level
中的静态
known
数组中


似乎
java.util.logging.Level
保留了对自身所有实例的静态引用。糟糕,讨厌的
java.util.logging.Level
!我能做点什么吗?java.util.logging框架由第三方库使用,因此我认为我没有不使用它的选择。

除了让Sun修复级别实现或更改库以取消其自定义级别之外,我能想到的唯一方法是将库从web应用程序类加载器中移出并放入容器中(共享或公共类加载器)

如果您这样做,仍然会有级别的自定义实例,但它们将不再链接到web应用程序。因此,如果您跳出web应用程序,它将继续循环使用相同的级别(而不是泄漏新的级别)


当然,这会影响库的类加载器,它可能会崩溃。有些东西需要在web应用程序中,并且不能移动到容器中。即使库继续工作,它本身也可能保留对web应用程序其他部分的类似引用,这将是完全相同的问题。不过,请给出这是一次尝试。

这是什么单位,字节?日志正在使用8个字节,您对此感到担忧?是的,它是字节,不,我不关心8个字节。我关心的是对WebappClassLoader的引用可以防止它被垃圾收集;它大约占10兆字节。您使用的是哪个JVM?还有,级别(与日志相对)实例是一个小的、固定的集合,例如INFO、FINER等。某个web应用程序是否创建了新的子类型?否则,为什么实例会阻止web应用程序被GC?如果这是一个安慰,Sun工程师正在讨论针对类归档错误…有关错误报告,请参阅。