问题标签 [soft-references]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
21551 浏览

java - 使用 Java 的 ReferenceQueue

SoftReference确实只有WeakReference在创建为实例变量时才有帮助?在方法范围内使用它们有什么好处吗?

另一大部分是ReferenceQueue。除了能够跟踪哪些引用被确定为垃圾之外,还Reference.enqueue()可以用来强制注册一个对象进行垃圾回收吗?

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

(想象一下,在这种情况下,Object 代表一个使用大量内存的对象类型……比如BufferedImage什么)

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

0 投票
1 回答
2721 浏览

android - 如何在 Android 应用程序中使用 Soft/WeakReference 类?

我正在维护一个包含大量图像的大型应用程序。我的主要问题是应用程序在我使用它时崩溃,因为它会产生内存错误。我正在尝试使用 SoftReferences 和 WeakReferences,我已经阅读过,但我不知道是否必须在 GridView、BaseAdapter 或 ImageView 等 Android 类中使用它们。

我的应用程序有一个带有标记的地图活动,顶部有一个画廊。当我点击一个气球时,第二个活动会出现一个网格视图。

第一个活动,当我移动地图时,活动会重新加载图库中的所有标记和图像并添加新的标记和图像。它具有以下属性:

射击按钮 射击按钮;画廊画廊;列出图像;私有 ImageView mMyLocationImage;

我的问题是当我移动地图、销毁或暂停活动时,我必须使用软/弱引用类做任何新的事情来释放内存?我是否必须添加带有软/弱引用类的新属性,例如必须将 GalleryAdapter 添加到软/弱引用类中,或者系统为我释放此内存?

第二个活动有一个包含用户所有图像的网格视图。我在进入活动时加载所有数据,并在活动需要时加载图像。我在这个活动中有以下内容。

ImageLoader_Profile 管理图像的加载。

在这种情况下,这是我需要做的全部还是我必须对软引用做任何其他事情?我有点困惑。

0 投票
3 回答
631 浏览

java - Java 中的地图大小不正确。如果我将 Key 和 Value 包装在 WeakReference 中,然后添加到 HashMap 中,则打印大小与预期不同

如果我不注释第 1 行和第 2 行,则第 1 行会导致 OutOfMemoryError。如果我做相反的事情,它不会导致 OutOfMemoryError,因为 <Key,Value> 包装在 WeakReference 中。但我无法理解第 3 行的输出 ---- i : 3869 Size : 3870 maxSize : 3870

来自 Java 文档:

因为垃圾收集器可能随时丢弃键,所以 WeakHashMap 可能表现得好像一个未知线程正在默默地删除条目。

基于此语句大小应该减少,但第 3 行输出似乎不断增加。为什么这样 ?

0 投票
1 回答
124 浏览

java - 如果类型擦除只允许我调用 Object() 方法,我如何调用 ReferenceQueue 中项目的方法?

我有一个参考队列,声明为:

我有一些以以下形式构建的软引用

根据文档,rqueueReferenceQueue<? extends MapChunk>

我希望在他们的垃圾收集上调用一个处理程序,这就是我将它们放入队列的原因。但是,当我开始从另一个线程处理队列时,我通过以下方式从队列中检索对象

我的编译器错误表明发生了类型擦除,我只剩ref.get()下一个对象(由于队列的原始类型)。我既不能在我需要的对象上调用方法,也不能将它传递给需要 aMapChunk本身的方法。当然,这会阻碍引用队列的许多使用,在这种情况下我可能会做错事。我确定我只会MapChunk在运行时获取对象,所以我应该使用演员表吗?做点别的吗?根本不使用参考队列?

编辑:如果我使用Reference<MapChunk> ref=rqueue.poll(),我会得到以下信息:

当我使用Reference<? extends MapChunk> ref=rqueue.poll();该行时,该错误已解决,但当我尝试使用时出现另一个错误ref

编辑:我想这只是一个错误的错误消息,因为当另一个错误被修复时,类型确实转换正确。

0 投票
0 回答
1215 浏览

android - 使用 FragmentStatePagerAdapter -Android 对方向更改片段的弱引用

我使用对片段的弱引用来跟踪片段状态页面适配器中的片段。我发现它比制作一个向量来跟踪实际片段更便宜。那么我可以调用一个名为 getFragmentt(2) 的函数,它会在我的弱引用列表中搜索片段,如果它还活着,它将返回真实对象。到目前为止一切顺利。现在,如果我旋转设备,fragmentManager 会重新创建片段,但弱引用会因此而丢失。当在方向改变时重新创建片段时,适配器甚至不会被调用。这是代码。

0 投票
1 回答
1407 浏览

android - Using LruCache and avoid OutOfMemoryException

There's an activity in my app whose showing around 1000 very small sized bitmaps (Around 20kb each bitmap). After it loads some of the bitmaps, there's an OutOfMemoryException.

I was first reading about SoftReference and it looked like it will solve my problem about the OOM exceptions. But then, I read that it won't cache my bitmaps and will free them "too soon", so it will have to decode the bitmap again and "waste" time.So, I implemented the LruCache.

How can I make sure that I will not get OOM exception when implementing my LruCache?

Maybe I should just use the SoftReference, because my main target is to avoid OOM

Or, this might be my solution? LruSoftCache

0 投票
0 回答
56 浏览

java - 可以访问所有现有项目的缓存

我有一个系统,其中对象(出于此问题的目的,它们是不可变的)是基于请求对象(可以像 url 或 a 一样简单long)创建的。它们是使用工厂方法创建的,而不是使用new.

如果请求的对象已经存在,那么如果我们可以获取对现有实例的引用,则请求新对象会更有效。

为此,我创建了一个类,目前UniversalCache<K, V>没有更好的名称。它有一个LruCache这样可以保留 X 数量的强引用,以及一个HashMap<K, SoftReference<V> >通过系统中的其他强引用来跟踪可能仍然保持活动状态的所有对象(我不依赖于SoftReference阻止对象成为 GC 'd)。

当创建一个尚未在缓存中的新对象时,它会连同它的键一起添加到缓存中。为了在缓存中搜索它,我使用键来获取引用并检查它是否仍然具有对对象的引用。

我遇到的问题是如何在对象被垃圾收集后删除这些键/引用对。我不想遍历整个HashMap搜索poll返回的引用null。由于所指对象并不总是可用的,因此我无法使用它来获取或生成密钥。所以我正在扩展SoftReference以存储密钥并使用它从HashMap. 这是一个好主意吗?我有一个与缓存KeyedSoftReference<K,Rt>具有相同类型的键的附加字段(最终与 相同)。KRtV

特别是我想就在哪里处理ReferenceQueue(目前它在get)以及如何投射我从中获得的对象提出建议ReferenceQueue.poll()

这是我到目前为止的代码:

0 投票
1 回答
448 浏览

java - Java SoftReference 保证失败

JDK 7 文档有这样的说法SoftReference

“保证在虚拟机抛出 OutOfMemoryError 之前清除所有对软可访问对象的软引用。”

但是,在我的测试程序中,我一直看到OutOfMemoryError除了下面的“陌生人行为”部分)

这是输出:

陌生人行为

非常奇怪的是,如果我重新设置 try-catch 块,程序似乎永远运行良好,打印“Referent still alive”。线,直到我累了,杀了它。

我在这一切中缺少什么?

0 投票
2 回答
596 浏览

java - 软引用内存不足时不收集垃圾

我正在测试缓存实现的 SoftReference,我发现了一个奇怪的行为:

我有一个setName(String name)通过 SoftReference 设置 Graph 对象名称的方法:

(garbagedData 是一个 ReferenceQueue,在这个特定问题中似乎并不重要)。

当我graph.setName("name");从主线程调用时,并且当 à 强制OutOfMemory出错时,引用指向的值不会被垃圾,但如果我调用graph.setName(new String("name")),那么它就是。

我用 Eclipse 内存分析器查看堆内容,在这两种情况下,除了 Soft 之外,没有其他引用链。

如果有人对这种奇怪的行为有解释,我很感兴趣。

0 投票
2 回答
647 浏览

java - 使用键和值的软引用实现缓存

我想实现一个缓存,其键和值是软引用,因为它将包含的实例可能需要很长时间来计算(尤其是值),我希望包含未引用对象的条目作为键或值当且仅当我可能内存不足时才能收集垃圾。如果我对这些值使用弱引用,那么一旦它们没有被引用,它们就会被垃圾收集,这不是我想要做的。

起初,我使用了这个例子。它可以工作,但是为每个缓存实例创建一个线程让我很恼火,它对键使用强引用并且我自己在缓存类的某些方法调用中清除过时的条目(如 WeakHashMap)在我冒险运行时不起作用(显然)当我不打电话给他们时,内存不足。我想使用 Guava,但 MapMaker 不再允许使用合乎逻辑的软键,因为默认等价是基于相等 (==) 而不是 equals() 方法,这意味着不可能重新创建相同的键。但是,我同意sebastien-lorber 的评论

如果 Guava 覆盖 SoftReference 的 equals 方法,我认为软键是有意义的。我已经看到 Guava 使用“等价机制”,我认为,对于软引用,defaultEquivalence 不应该是身份,而是等于,来处理这种情况。

我也查看了 MapDB 和 JCS。

如何修改上面引用的示例或使用 Guava 基于软引用进行缓存,最好使用 equals() 而不是 == 来确定键的相等性?