有没有办法在Java中强制使用弱的和/或软引用的对象?

Sco*_*ott 12 java garbage-collection reference weak-references soft-references

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

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

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

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

看起来好像JVM承认有这些对象只弱/软引用,但我不能强迫它GC这些东西是100%肯定.(所以,我想要的是,它完全从堆中消失,其permgen的类加载器使用也会消失.)

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

Pau*_*ora 10

调用GC应始终释放所有弱可达对象(假设通过调用实现的"请求" System.gc实际被授予).如果GC没有清除弱引用,则意味着对象至少可以轻松访问.

清除软引用比较棘手,因为这取决于JVM的判断.保证清除可轻松访问的对象的唯一方法OutOfMemoryError是抛出一个.这个技巧在本次讨论中得到了证明.

  • `System.gc` 不是只是一个提示吗?那么这个问题的答案不就是“不”吗? (2认同)