Tag: 软引用

有没有办法在Java中强制使用弱的和/或软引用的对象?

这是我的用例。 我们正在尝试缩小应用程序中潜在的内存泄漏,我们正在使用内存分析工具对堆进行快照,以便我们可以查找对象实例和引用。 (如果它有帮助,我们正在使用YourKit。) 此应用程序广泛使用动态和CGLIB代理,最终在WeakHashMaps中存储大量类和类加载器的引用。 在我们的测试用例运行之后,我们期望对对象X及其类加载器的所有硬引用都消失了,但是由于测试用例中涉及很多代理,我们还有许多弱/软引用。 (我只能找到WeakHashMap引用,但是YourKit将弱引用和软引用都包含在摘要中的一个行项中,所以我不能确定我在某个地方没有错过软引用。) 即使在从JVM请求完整GC之后也是如此。 (在服务器模式下使用sun 1.6.0_23 JDK。) 似乎 JVM承认只有弱/软引用这些对象,但我不能强迫它对GC这些事情是100%肯定的。 (所以,我想要的是,它完全从堆中消失,其permgen的类加载器使用也会消失。) 任何人都知道配置和/或强制JVM处理仅软/弱引用的对象的方法吗?

Java中的软引用LinkedHashMap?

Java中是否存在基于softreference的LinkedHashMap? 如果不是,有没有人得到我可以重用的代码片段? 我保证能正确引用它。 谢谢。

如何在Java中清除软引用?

我有一个缓存,它具有对缓存对象的软引用。 我正在尝试为类的行为编写function测试,这些类使用缓存专门用于清除缓存对象时发生的情况。 问题是:我似乎无法可靠地获得要清除的软引用。 简单地使用一堆内存不起作用:在清除任何软引用之前,我得到一个OutOfMemory。 有没有办法让Java更加热切地清理软引用? 在这里找到 : “虽然在抛出OutOfMemoryError之前所有SoftReferences都会被清除,但是理论上它们不会导致OOME。” 那么这是否意味着上面的场景必须意味着我的内存泄漏,某些类在我的缓存对象上持有一个硬引用?

JVM如何在实践中收集SoftReferences?

我有一个在JVM中运行的两个单独的缓存(一个由第三方库控制),每个缓存都使用软引用。 我希望JVM在由库控制的缓存之前清除我的受控缓存。 SoftReference javadoc指出: 在虚拟机抛出OutOfMemoryError之前,保证已清除对软可访问对象的所有软引用。 否则,不会对清除软引用的时间或清除对不同对象的一组此类引用的顺序施加约束。 但是,鼓励虚拟机实现偏向清除最近创建或最近使用的软引用。 此类的直接实例可用于实现简单缓存; 此类或派生的子类也可用于更大的数据结构,以实现更复杂的高速缓存。 只要软引用的引用是强可达的,即实际上是在使用中,软引用就不会被清除。 因此,复杂的高速缓存可以例如通过保持对这些条目的强烈指示来防止其最近使用的条目被丢弃,留下剩余的条目由垃圾收集器决定丢弃。 常见的JVM实现(尤其是HotSpot)如何在实践中处理SoftReferences? 他们是否“反对清除最近创建或最近使用的软参考”,这是由规范鼓励的?

如何让java系统发布Soft References?

我将使用基于SoftReference的缓存(一个非常简单的事情)。 但是,我在为它编写测试时遇到了一个问题。 测试的目的是检查缓存是否在内存清理发生后再次从服务器请求先前缓存的对象。 在这里,我找到了如何使系统释放软引用对象的问题。 调用System.gc()是不够的,因为在内存不足之前不会释放软引用。 我在PC上运行此unit testing,因此VM的内存预算可能非常大。 ==================后来添加============================== 谢谢所有照顾的人! 在考虑了所有职业选手和反对者之后,我决定按照nanda和jarnbjo的建议采取蛮力方式。 然而,似乎JVM并不是那么愚蠢 – 如果你要求一个比VM的内存预算更大的块,它甚至都不会尝试垃圾收集。 所以我修改了这样的代码: /* Force releasing SoftReferences */ try { final List memhog = new LinkedList(); while(true) { memhog.add(new long[102400]); } } catch(final OutOfMemoryError e) { /* At this point all SoftReferences have been released – GUARANTEED. */ } /* continue the test here […]

使用Java的ReferenceQueue

SoftReference和WeakReference真的只在创建为实例变量时才有用吗? 在方法范围内使用它们有什么好处吗? 另一个重要的部分是ReferenceQueue 。 除了能够跟踪哪些引用被确定为垃圾之外,还可以使用Reference.enqueue()来强制注册垃圾回收对象吗? 例如,是否值得创建一个方法,该方法在对象中占用大量内存资源(由强引用保存)并创建引用以将它们排入队列? Object bigObject; public void dispose() { ReferenceQueue queue = new ReferenceQueue(); WeakReference ref = new WeakReference(bigObject, queue); bigObject = null; ref.enqueue(); } (想象一下,在这种情况下,Object表示一个使用大量内存的对象类型……比如BufferedImage或者其他东西) 这有什么现实的效果吗? 或者这只是浪费代码?