当前位置:  开发笔记 > 编程语言 > 正文

如何在Java中清除软引用?

如何解决《如何在Java中清除软引用?》经验,为你挑选了3个好方法。

我有一个缓存,它具有对缓存对象的软引用.我正在尝试为类的行为编写功能测试,这些类使用缓存专门用于清除缓存对象时发生的情况.

问题是:我似乎无法可靠地获得要清除的软引用.简单地使用一堆内存并不能解决问题:在清除任何软引用之前,我得到一个OutOfMemory.

有没有办法让Java更加急切地清理软引用?


在这里找到:

"虽然在抛出OutOfMemoryError之前所有的SoftReferences都会被清除,但是理论上它们不会导致OOME."

那么这是否意味着上面的场景必须意味着我的内存泄漏,某些类在我的缓存对象上持有一个硬引用?



1> Andrzej Doyl..:

问题是:我似乎无法可靠地获得要清除的软引用.

这不是SoftReferences独有的.由于Java中垃圾收集的性质,无法保证任何可垃圾收集的内容实际上都会在任何时间点收集.即使只有一点点代码:

Object temp = new Object();
temp = null;
System.gc();

无法保证在第一行中实例化的Object在此处或实际上任何点都是垃圾收集.它只是你用内存管理语言生活的东西之一,你放弃了对这些东西的陈述力.是的,这可能使得有时难以确定地测试内存泄漏.


也就是说,根据你引用的Javadocs,应该在抛出OutOfMemoryError之前清除SoftReferences(实际上,这是它们的全部要点,也是它们与默认对象引用的唯一不同).因此,听起来存在某种类型的内存泄漏,因为您需要对相关对象进行更难的引用.

如果你使用-XX:+HeapDumpOnOutOfMemoryErrorJVM 的选项,然后将堆转储加载到像jhat这样的东西,你应该能够看到对象的所有引用,从而看看你的软件旁边是否有任何引用.或者,您可以在测试运行时使用分析器实现相同的功能.


Eclipse的内存分析器比jhat更好:http://www.eclipse.org/mat

2> Luke Quinane..:

还有以下JVM参数用于调整软引用的处理方式:

-XX:SoftRefLRUPolicyMSPerMB=

其中'value'是毫秒数,每个Mb内存的软引用将保留.默认值为1s/Mb,因此如果一个对象只是软可达,如果只有1Mb的堆空间可用,它将持续1s.



3> David Gageot..:

您可以使用这段代码强制在测试中清除所有SoftReferences .

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有