java - 有没有办法在 Java 中强制对弱和/或软引用对象进行 GC?

标签 java reference garbage-collection weak-references soft-references

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

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

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

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

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

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

最佳答案

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

清除软引用比较棘手,因为这取决于 JVM 的判断力。保证清除软可达对象的唯一方法是引发 OutOfMemoryErrorthis discussion 演示了这个技巧.

关于java - 有没有办法在 Java 中强制对弱和/或软引用对象进行 GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968141/

相关文章:

java - Java JVM 中的信号量处理和线程控制

c++ - 有什么办法可以帮助代码返回值是 const 引用吗?

actionscript-3 - 在 AS3 的事件监听器中使用弱引用的(缺点)优点是什么?

java - 方法引用 Static - 小程序示例给建议

c# - C# 引用类型在方法内存活多久?

java - 是否收集了 lambda 垃圾?

java - 在JavaFX中更改舞台背景颜色

java - 启用 proguard 时出现 Jackson 错误(缩小)

java - 如何使用我的应用程序 (Java) 在 Android 中设置桌面图案(背景)?

garbage-collection - 如何最小化 Go 中的垃圾收集?