2

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

替代文字

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

似乎java.util.logging.Level保持对自身所有实例的静态引用。糟糕,恶心java.util.logging.Level!我能做些什么吗?java.util.logging 框架被第三方库使用,所以我认为我没有不使用它的选项。

4

1 回答 1

2

除了让 Sun 修复关卡实现或更改您的库以取消其自定义关卡,我能想到的唯一方法是将库移出 Web 应用程序类加载器并进入容器(共享或公共类加载器)。

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

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

于 2010-10-19T04:50:03.217 回答