问题标签 [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 投票
1 回答
627 浏览

java - google-guava MapMaker .softValues() - 值没有得到 GC-ed,OOME:HeapSpace 跟随

我在使用 google-guava 的 MapMaker 时遇到问题。这是代码:

当 java 被称为:(java -Xms2m -Xmx2m -cp guava-r09.jar:. test.MapMakerTest堆设置非常小,以便更容易看到发生了什么)在第 60 次迭代时,它会因 OutOfMemoryError: HeapSpace 而爆炸。

但是,当映射是Map<String, SoftReference<String>>(并根据其余代码中的更改:侦听器和 put),我可以看到正在发生的驱逐,并且代码可以正常工作,并且值会被垃圾收集。

在所有文档中,包括以下文档:http: //guava-libraries.googlecode.com/svn/tags/release09/javadoc/index.html,都没有明确提及 SoftReferences。调用 put 时,Map 实现不应该将值包装在 SoftReference 中吗?我真的对假定的用法感到困惑。

我正在使用番石榴 r09。

谁能解释我做错了什么,为什么我的假设是错误的?

最好的问候, wujek

0 投票
1 回答
2863 浏览

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

这是我的用例。我们正在尝试缩小应用程序中潜在的内存泄漏,并且我们正在使用内存分析工具对堆进行快照,以便我们可以查找对象实例和引用。(如果有帮助,我们正在使用 YourKit。)

该应用程序广泛使用动态代理和 CGLIB 代理,最终在 WeakHashMaps 中存储了大量对类和类加载器的引用。

在我们的测试用例运行之后,我们期望对对象 X 及其类加载器的所有硬引用都消失了,但是由于最终测试用例中涉及到许多代理,我们留下了许多弱/软引用。(我只能找到 WeakHashMap 引用,但是 YourKit 将弱引用和软引用都包装到摘要中的一个行项中,所以我不能确定我没有在某处遗漏软引用。)

即使在从 JVM 请求完整的 GC 之后也是如此。(在服务器模式下使用 sun 1.6.0_23 JDK。)

似乎JVM 承认这些对象只有弱/软引用,但不能强迫它 GC 这些东西是 100% 确定的。(所以,我想要的是让它完全从堆中消失,并且它对 permgen 的类加载器使用也消失了。)

任何人都知道配置和/或强制JVM处理仅软/弱引用的对象的方法吗?

0 投票
2 回答
1311 浏览

android - Android图像缓存——硬HashMaps和软HashMaps问题

我现在在我的应用程序中尝试做的是修改谷歌去年在他们的一个教程中推出的ImageDownloader类,该类异步下载和缓存 ImageViews 的图像而不会泄露上下文。

换句话说,由于我正在使用一个全局缓存单例对象,它提供对我的位图 HashMaps 的引用,我只需要知道:因为我必须根据我的应用程序的某些方面(客户端要求)分别缓存图像,我应该有每种类型的位图都有一对硬和软 HashMap,或者只有一个软 HashMap,当其他硬缓存被按下空间时将它们的文件移动到其中,效率会更高吗?

0 投票
2 回答
908 浏览

python - Python中可以存在“软引用”吗?

在其他语言(例如 Java)中,对象引用可以是强、弱、软或幻象(http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html)。

在 Python 中,默认情况下引用是强引用,并且 WeakRef 模块允许弱引用。

是否可以在 Python 中使用“软引用”?

在我的特定情况下,我有一个创建耗时的对象缓存。有时可能没有对缓存对象的引用,但如果我不需要(即如果内存充足),我不想丢弃缓存对象。

0 投票
1 回答
2427 浏览

android - 延迟列表上的位图缓存(软引用,硬)似乎无法正常工作 - Android

我已经阅读了有关 stackoverflow 中延迟列表加载的几个主题,并且我正在尝试了解如何在 android 中处理不同的缓存级别。

如此处所述:

ListView 中图像的延迟加载

我用

Multithreading For Performance,Gilles Debunne 的教程。

例子。我对其进行了修改,以便以正确的方式工作并且也可以使用 1.6。这是代码:

}

我完全理解这个例子背后的逻辑,但是我很困惑为什么它不能正常工作。

我们有两级缓存:硬缓存和软引用缓存。我们将位图保存在硬缓存中,然后当填充时我们保存在 SoftReference 中并重新排序硬缓存..

然后我关闭应用程序,关闭互联网并重新启动它。在构造函数中,我们调用 resetPurgeTimer() 来清除缓存,因此缓存中没有任何内容。为了避免这种情况,我注释了该行以便不清除缓存。我重新启动我的应用程序,我可以看到 SoftReference 缓存中存在 6-7 个图像(根据 LogCat)。

我知道当调用 GC 时 SoftReference 缓存可能会变空,但即使在关闭应用程序或禁用 wifi 之前它也几乎是空的……SoftReferences 有一个众所周知的错误,即使内存没有变低也会被垃圾收集。

这个广泛使用的例子有问题吗?

提前致谢,

安德烈亚斯

0 投票
2 回答
822 浏览

java - 当 PhantomReference/SoftReference/WeakReference 排队时,你怎么知道它指的是什么?

我没有使用 PhantomReferences。实际使用的好例子似乎很少。

当一个幻影出现在您的队列中时,您如何知道它是/曾经是哪个对象?get() 方法似乎没用。根据JavaDoc

因为幻影引用的所指对象始终不可访问,所以此方法始终返回 null。

我认为,除非您的对象是单例,否则您总是希望使用 PhantomReference 的子类,您可以在其中放置您需要的任何纪念品,以了解死亡的原因。

这是正确的,还是我错过了什么?

这对于 SoftReferences 也是如此吗?对于弱引用?

指向相关使用示例的链接会很棒。

0 投票
3 回答
3502 浏览

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

基本区别在于,弱引用应该在每次运行 GC 时声明(保持低内存占用),而软引用应该保留在内存中,直到 GC 实际需要内存(它们试图延长生命周期但可能随时失败,这对于例如缓存非常有用,尤其是相当昂贵的对象)。

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

就个人而言,我认为它们的行为类似于软引用,但这只是一种印象,没有根据。

当然,实施细节适用。我在问与.NET 的弱引用相关的心态——它们是否能够延长生命周期,或者它们的行为是否像真正的弱引用?

(尽管有许多相关问题,但我还没有找到这个特定问题的答案。)

0 投票
3 回答
663 浏览

java - Java SoftReference,恐慌 GC 和 GC 行为

我想SoftReference使用尽可能多的内存使用 s 编写缓存,只要它不会变得太低效。

尝试通过计算对象大小或通过获取一些已使用内存的近似值来估计已使用的大小JVM是死胡同。

javadoc 甚至声明s 对内存感知缓存有好处,但是对于实现如何处理sSoftReference没有硬性规定。我只是在谈论(版本 6.22 及更高版本和版本 7)的 Oracle 实现。JVMSoftReferenceJVM

现在我的问题(请随意回答部分,分组或以任何你喜欢的方式):

  1. 是否JVM考虑对象的最后一次访问并且只删除旧的?Javadoc 指出:Virtual machine implementations are, however, encouraged to bias against clearing recently-created or recently-used soft references.
  2. 当记忆变得紧张时会发生什么?JVM恐慌,只是吃掉所有的物体?
  3. 是否有一个参数告诉JVM只吃多少才能生存(没有OOMEs)和健康生活(没有CPU只运行GC
0 投票
1 回答
5216 浏览

java - Android上使用SoftReference缓存Bitmap导致OOM

我正在开发一个需要加载位图的应用程序。并使用SoftReference缓存。我将每个软引用与 a 相关联,ReferenceQueue并使用哈希映射来访问SoftReference. 如下图所示:

然后,当我写clean()这样的:

它检查哈希表中的所有 SoftReferences 是否不为空。内存缓存看起来不错,但如果我只写:

只去掉被放入ReferenceQueue的元素,Log然后打印的越来越多=,虽然有一些减少,但有增加的趋势

正如http://www.ibm.com/developerworks/library/j-refs/中提到的

的设置为空referentSoftReference但大部分SoftReference不在ReferenceQueue。只是在对象被标记为可终结但未最终确定的状态之间?标记为 finalizable 但未最终确定的 Bitmap 会被回收吗?

0 投票
2 回答
349 浏览

java - Java EE 编程中使用弱引用和软引用的地方

我是 Java EE 开发人员,但我不知道在日常编程中哪里可能使用弱引用或软引用。