我有一个缓存,其中包含对缓存对象的软引用。我正在尝试针对使用高速缓存的类的行为编写功能测试,专门用于清除高速缓存的对象时发生的情况。
问题是:我似乎无法可靠地清除软引用。简单地用完一堆内存并不能解决问题:在清除任何软引用之前,我会得到一个OutOfMemory。
有什么方法可以使Java更急切地清除软引用?
在这里 找到 :
“尽管可以保证所有的SoftReferences在抛出OutOfMemoryError之前都会被清除,所以从理论上讲它们不会导致OOME。”
那么这是否意味着上述情况一定意味着我的某处内存泄漏,某个类在我的缓存对象上保留了一个硬引用?
问题是:我似乎无法可靠地清除软引用。
这不是SoftReferences所独有的。由于Java中垃圾回收的性质,无法保证任何时候都可以实际收集任何可垃圾回收的东西。即使使用简单的代码:
Object temp = new Object();
temp = null;
System.gc();
不能保证在第一行实例化的对象在此时或实际上在任何时候都是垃圾回收。这只是您必须使用内存管理的语言来处理的事情之一,您正在放弃对这些事情的声明性权力。是的,这可能使得有时很难进行明确的内存泄漏测试。
就是说,根据您引用的Javadocs,在抛出OutOfMemoryError之前,绝对应该清除SoftReferences(实际上,这是它们的全部要点,并且是它们与默认对象引用不同的唯一方式)。因此,听起来好像存在某种内存泄漏,因为您要保留对所涉及对象的更严格的引用。
如果-XX:+HeapDumpOnOutOfMemoryError
对JVM
使用该选项,然后将堆转储加载到诸如jhat之类的东西中,则应该能够看到对对象的所有引用,从而可以查看软引用旁边是否有任何引用。或者,您可以在运行测试时使用探查器来实现相同的目的。
问题内容: 我的 单元/集成测试 包括搜索功能的测试。 我的想法是在每次测试之前有一个空的搜索索引。因此,我正在尝试删除方法(它是Groovy代码)的索引中的所有元素: 似乎它正在异步处理所有删除操作,因此在它之后添加了它。如您所见,我尝试几次打开/关闭连接-在那里没有帮助。 这个问题有时需要更多时间,有时需要5秒钟以上才能删除,有时无法找到刚刚添加的数据(来自先前的测试),等等。而最令人烦恼的是
问题内容: 我在gui中有一个jList,可以在其中使用“添加”按钮添加一些数据。我想添加另一个名为“清除”的按钮,它将清除所有元素。我尝试了这个: 当我点击添加按钮时,这将添加元素。 当我单击清除按钮时,这将删除元素。 但是,当我重新单击“添加”按钮时, 问题答案: 您不应该只是为了删除其中的某些项目而重新初始化整个JList小部件。相反,您应该操纵列表模型,因为对它的更改会“自动”同步回UI。
我想知道如何才能清除控制台屏幕在Java。我使用的IDE是IntelliJ IDEA。例如:在C语言中我们用来写:clrscr();
我正在创建一个简单的程序,在那里我画一个黑色的椭圆形,在那里我用鼠标点击。然而,我希望一个新的椭圆形出现,旧的消失。我该怎么做?我把removeAll()方法插入到我的mousePressed方法中,但它对我不起作用。removeAll()方法是否适用于此?还是我应该用别的?很抱歉,如果答案很明显,但我仍然是新手,并试图学习。任何建议都将不胜感激。谢谢
问题内容: 在Go中清除切片的适当方法是什么? 这是我在go论坛中找到的内容: 这样对吗? 为了澄清起见,清除了缓冲区,以便可以重用它。 一个示例是bytes包中的Buffer.Truncate函数。 请注意,Reset只是调用Truncate(0)。因此看来,在这种情况下,第70行将评估:b.buf = b.buf [0:0] http://golang.org/src/pkg/bytes/bu
问题内容: 我在寻找类似c ++函数 的原始类型。 还是应该只创建一个新地图? 更新:谢谢您的回答。通过查看答案,我刚刚意识到有时创建新地图可能会导致某些我们不希望出现的不一致情况。考虑以下示例: 我的意思是,这仍然与c ++中的功能不同,后者将清除对象中的内容。 问题答案: 您可能应该只创建一个新地图。没有真正的理由去尝试清除现有的代码,除非同一段映射被多个代码引用,并且一个代码段明确需要清除值