我将使用基于 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 */