如何让Java系统发布软引用?
我将使用基于SoftReference的缓存(这本身就是一件非常简单的事情)。但是,我在为它编写测试时遇到了一个问题。
测试的目的是检查缓存是否在内存清理发生后再次从服务器请求以前缓存的对象。
在这里,我发现了如何使系统释放软引用对象的问题。调用 System.gc() 是不够的,因为在内存不足之前不会释放软引用。我在PC上运行此单元测试,因此VM的内存预算可能非常大。
===== 稍后添加 ===========================================================================================================================================================================================================================================================================================================================================================================================================
谢谢所有关心回答的人!
在考虑了所有优点和缺点之后,我决定按照nanda和jarnbjo的建议走蛮力的方式。然而,JVM似乎并没有那么愚蠢 - 如果你要求一个单独大于VM内存预算的块,它甚至不会尝试垃圾回收。所以我修改了这样的代码:
/* Force releasing SoftReferences */
try {
final List<long[]> memhog = new LinkedList<long[]>();
while(true) {
memhog.add(new long[102400]);
}
}
catch(final OutOfMemoryError e) {
/* At this point all SoftReferences have been released - GUARANTEED. */
}
/* continue the test here */