我有一个缓存,它具有对缓存对象的软引用.我正在尝试为类的行为编写功能测试,这些类使用缓存专门用于清除缓存对象时发生的情况.
问题是:我似乎无法可靠地获得要清除的软引用.简单地使用一堆内存并不能解决问题:在清除任何软引用之前,我得到一个OutOfMemory.
有没有办法让Java更加急切地清理软引用?
在这里找到:
"虽然在抛出OutOfMemoryError之前所有的SoftReferences都会被清除,但是理论上它们不会导致OOME."
那么这是否意味着上面的场景必须意味着我的内存泄漏,某些类在我的缓存对象上持有一个硬引用?
这是我的用例.我们正在尝试缩小应用程序中潜在的内存泄漏,我们正在使用内存分析工具对堆进行快照,以便我们可以查找对象实例和引用.(如果它有帮助,我们正在使用YourKit.)
该应用程序广泛使用动态和CGLIB代理,最终在WeakHashMaps中存储大量类和类加载器的引用.
在我们的测试用例运行之后,我们期望对对象X及其类加载器的所有硬引用都消失了,但是由于测试用例中涉及很多代理,我们还有许多弱/软引用.(我只能找到WeakHashMap引用,但是YourKit将弱引用和软引用都包含在摘要中的一个行项中,所以我不能确定我在某处没有错过软引用.)
即使在从JVM请求完整GC之后也是如此.(在服务器模式下使用sun 1.6.0_23 JDK.)
这看起来好像JVM承认有这些对象只弱/软引用,但我不能强迫它GC这些东西是100%肯定.(所以,我想要的是,它完全从堆中消失,其permgen的类加载器使用也会消失.)
任何人都知道配置和/或强制JVM处理仅软/弱引用的对象的方法吗?
java garbage-collection reference weak-references soft-references
我知道软引用只会在 JVM 内存不足时释放。我怎样才能手动完成呢?
我的代码:
Object object = new Object();
ReferenceQueue queue = new ReferenceQueue();
SoftReference softReference= new SoftReference(object, queue);
object = null;
System.gc();
//now I force release soft reference.
Run Code Online (Sandbox Code Playgroud)
最新的java版本(8-11)有解决方案吗?