12

这是我的用例。我们正在尝试缩小应用程序中潜在的内存泄漏,并且我们正在使用内存分析工具对堆进行快照,以便我们可以查找对象实例和引用。(如果有帮助,我们正在使用 YourKit。)

该应用程序广泛使用动态代理和 CGLIB 代理,最终在 WeakHashMaps 中存储了大量对类和类加载器的引用。

在我们的测试用例运行之后,我们期望对对象 X 及其类加载器的所有硬引用都消失了,但是由于最终测试用例中涉及到许多代理,我们留下了许多弱/软引用。(我只能找到 WeakHashMap 引用,但是 YourKit 将弱引用和软引用都包装到摘要中的一个行项中,所以我不能确定我没有在某处遗漏软引用。)

即使在从 JVM 请求完整的 GC 之后也是如此。(在服务器模式下使用 sun 1.6.0_23 JDK。)

似乎JVM 承认这些对象只有弱/软引用,但不能强迫它 GC 这些东西是 100% 确定的。(所以,我想要的是让它完全从堆中消失,并且它对 permgen 的类加载器使用也消失了。)

任何人都知道配置和/或强制JVM处理仅软/弱引用的对象的方法吗?

4

1 回答 1

10

调用 GC 应始终释放所有弱可达对象(假设调用发出的“请求”System.gc实际上已被授予)。如果弱引用没有被 GC 清除,这意味着对象至少是软可访问的。

清除软引用比较棘手,因为这取决于 JVM 的判断。保证清除软可达对象的唯一方法是引发 anOutOfMemoryError被抛出。这个技巧在这个讨论中得到了展示。

于 2011-08-06T16:31:43.443 回答