标签: soft-references


Java:强/弱/弱/幻像参考之间的区别

我已经阅读了关于这个主题的这篇文章,但我真的不明白它.在描述概念时,请给我一些建议和示例.

java reference weak-references phantom-reference soft-references

164
推荐指数
7
解决办法
8万
查看次数

了解Java的Reference类:SoftReference,WeakReference和PhantomReference

有人可以解释三个参考类之间的区别(或发布链接到一个很好的解释)?SoftReference> WeakReference> PhantomReference,但当我会用每一个?为什么会出现WeakHashMap,但没有SoftHashMapPhantomHashMap

如果我使用以下代码......

WeakReference<String> ref = new WeakReference<String>("Hello!");
if (ref != null) {                 // ref can get collected at any time...
    System.gc();                   // Let's assume ref gets collected here.
    System.out.println(ref.get()); // Now what?!
}
Run Code Online (Sandbox Code Playgroud)

...怎么了?我是否必须ref在每个语句之前检查是否为null(这是错误的,但我应该怎么做)?对不起快速问题,但我无法理解这些Reference课程......谢谢!

java reference weak-references phantom-reference soft-references

80
推荐指数
2
解决办法
2万
查看次数

Java中有SoftHashMap吗?

我知道有一个WeakHashMapin java.util,但由于它只使用了WeakReferences,只有这个Map引用,引用的对象将在下一个GC循环中丢失.因此,如果您想要缓存随机数据,这几乎是无用的,这很可能会再次被请求而不会在其余时间进行硬链接.最好的解决方案是使用SoftReferences代替的地图,但我没有在Java RT Package中找到一个.

java weak-references hashmap soft-references

63
推荐指数
2
解决办法
2万
查看次数

如何使用可用RAM有效地在Java中缓存对象?

我需要使用一定比例的可用RAM来缓存Java中的对象.我知道其他人已经提出了这个问题,但没有一个回复符合我的要求.

我的要求是:

  • 简单轻巧
  • 并不比普通的HashMap慢得多
  • 使用LRU或一些近似LRU的删除策略

我尝试使用LinkedHashMap,但是它要求你指定最大数量的元素,我不知道填充可用RAM需要多少元素(它们的大小会有很大差异).

我目前的方法是使用Google Collection的MapMaker,如下所示:

Map<String, Object> cache = new MapMaker().softKeys().makeMap();
Run Code Online (Sandbox Code Playgroud)

这看起来很有吸引力,因为它应该在需要更多RAM时自动删除元素,但是存在一个严重的问题:它的行为是填满所有可用的RAM,此时GC开始抖动,整个应用程序的性能急剧恶化.

我听说过像EHCache这样的东西,但它对于我需要的东西似乎相当重,而且我不确定它是否足够快我的应用程序(记住解决方案不能比HashMap慢得多) .

java caching soft-references guava

25
推荐指数
1
解决办法
1万
查看次数

使用Java的ReferenceQueue

不要SoftReferenceWeakReference当为实例变量创建真的只有帮助吗?在方法范围内使用它们有什么好处吗?

另一个重要的部分是ReferenceQueue.除了能够跟踪确定垃圾的哪些引用外,还Reference.enqueue()可以用来强行注册垃圾回收对象?

例如,是否值得创建一个方法,该方法在对象中占用大量内存资源(由强引用持有)并创建引用以将它们排入队列?

Object bigObject;
public void dispose() {
    ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
    WeakReference<Object> ref = new WeakReference<Object>(bigObject, queue);
    bigObject = null;
    ref.enqueue();
}
Run Code Online (Sandbox Code Playgroud)

(想象一下,在这种情况下,Object表示一个使用大量内存的对象类型...喜欢BufferedImage什么的)

这有什么现实的效果吗?或者这只是浪费代码?

java memory garbage-collection weak-references soft-references

23
推荐指数
3
解决办法
2万
查看次数

如何在Java中清除软引用?

我有一个缓存,它具有对缓存对象的软引用.我正在尝试为类的行为编写功能测试,这些类使用缓存专门用于清除缓存对象时发生的情况.

问题是:我似乎无法可靠地获得要清除的软引用.简单地使用一堆内存并不能解决问题:在清除任何软引用之前,我得到一个OutOfMemory.

有没有办法让Java更加急切地清理软引用?


这里找到:

"虽然在抛出OutOfMemoryError之前所有的SoftReferences都会被清除,但是理论上它们不会导致OOME."

那么这是否意味着上面的场景必须意味着我的内存泄漏,某些类在我的缓存对象上持有一个硬引用?

java garbage-collection soft-references

20
推荐指数
3
解决办法
1万
查看次数

C#弱引用实际上是软的吗?

基本的不同之处在于,应该在每次运行GC时声明弱引用(保持内存占用率低),而软引用应该保留在内存中,直到GC实际需要内存(它们尝试扩展生命周期但可能随时失败,这对于例如特别是相当昂贵的对象的高速缓存是有用的.

据我所知,没有明确的陈述说明弱引用如何影响.NET中对象的生命周期.如果它们是真正的弱参考,它们根本不应该影响它,但是这也会使它们对于我们认为缓存的主要目的而言毫无用处(我错了吗?).另一方面,如果他们的行为像软参考,他们的名字有点误导.

就个人而言,我想他们的行为就像软参考,但这只是一种印象,而不是创立.

当然,实施细节也适用.我问的是与.NET的弱引用相关的心态 - 它们是否能够延长寿命,还是它们的行为像真正的弱引用?

(尽管有一些相关的问题我还没找到这个具体问题的答案.)

.net c# garbage-collection weak-references soft-references

18
推荐指数
2
解决办法
3190
查看次数

为什么.NET没有像Soft一样的SoftReference和WeakReference?

我真的很喜欢WeakReference.但我希望有一种方法可以告诉CLR多少(比如说,在1到5的范围内)你认为参考的程度有多弱.那将是辉煌的.

Java有SoftReference,WeakReference,我相信第三种类型称为"幻像引用".这就是那里的3个级别,GC在决定该对象是否获得切割时具有不同的行为算法.

我正在考虑对.NET的WeakReference进行子类化(幸运的是,并且稍微有点不好意思,它没有密封)来创建一个基于到期计时器或其他东西的伪SoftReference.

c# weak-references soft-references

17
推荐指数
4
解决办法
4686
查看次数

如何让java系统发布Soft References?

我将使用基于SoftReference的缓存(一个非常简单的事情).但是,我在为它编写测试时遇到了一个问题.

测试的目的是检查缓存是否在内存清理发生后再次从服务器请求先前缓存的对象.

在这里,我找到了如何使系统释放软引用对象的问题.调用System.gc()是不够的,因为在内存不足之前不会释放软引用.我正在PC上运行此单元测试,因此VM的内存预算可能非常大.

==================后来添加==============================

谢谢所有照顾的人!

考虑到所有职业选手和反对者后,我决定按照nandajarnbjo的建议采取蛮力方式.然而,似乎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 */
Run Code Online (Sandbox Code Playgroud)

java caching soft-references

17
推荐指数
3
解决办法
5461
查看次数