问题标签 [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.
java - 了解关于引用队列的幻像引用与弱引用
根据链接https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html,只有当对象从内存中物理移除并且WeakReferences在最终确定或垃圾收集之前入队时, PhantomReferences才会入队实际发生了。
不同之处在于排队发生的确切时间。一旦弱引用指向的对象变得弱可达,弱引用就会被排队。这是在最终确定或垃圾收集实际发生之前;理论上,对象甚至可以通过非正统的 finalize() 方法“复活”,但 WeakReference 将保持死态。仅当对象从内存中物理删除时,PhantomReferences 才会入队,并且 get() 方法始终返回 null 专门用于防止您能够“复活”几乎死掉的对象。
而根据http://www.ibm.com/developerworks/library/j-refs/,在释放堆对象之前将PhantomReference添加到其ReferenceQueue中,并且在完成或垃圾回收之后将WeakReferences添加到其 ReferenceQueue 中。
与软引用和弱引用不同,PhantomReference 在堆对象被释放之前被添加到它的 ReferenceQueue 中。(请记住,所有 PhantomReference 对象都必须使用关联的 ReferenceQueue 创建。)这允许在回收堆对象之前采取行动。
当堆对象的 finalize() 方法运行并释放其内存时,WeakReference 对象将添加到其 ReferenceQueue(如果存在)。
我很困惑。哪一个是正确的?
基本上我想知道关于引用队列的弱引用和幻像引用之间的区别?
java - 在 Map 中使用 SoftReference?
我在一个遗留项目中看到了 LRU 缓存的下面实现,我SoftReference
对值对象的使用有疑问,但对关键对象没有疑问。
这是实现
如果应用程序即将达到 OutOfMemory(OOM),GC 会为可软访问对象回收内存。如果我应用相同的逻辑,则只应回收值的内存(因为仅为值对象创建软引用)。
但这是文件开头的注释
我的问题是一旦应用程序到达 OOM,将如何从地图中删除相应的关键对象。密钥不应该也用软引用包装吗?
android - Android:对活动的软引用
InputMethodManager 保持对已销毁活动的软引用。以下是我的 HPROF 转储直方图。
- android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper @ 0x43b7f768 本机堆栈
- mInputConnection java.lang.ref.SoftReference @ 0x42b51da0
- com.android.internal.widget.EditableInputConnection @ 0x43b7f738
- mTextView, mTargetView android.support.v7.internal.widget.TintEditText @
- mClipExMgr android.sec.clipboard.ClipboardExManager @ 0x434ee190
- 我的活动
它可能是一个 EditText。我是否也需要在活动的 onDestroy 上删除视图上的侦听器?还是我应该忽略这个?
python - 有没有办法使用 Numpy 数组制作软引用或类似指针的对象?
我想知道是否有一种方法可以将许多不同数组中的数据引用到一个数组,但不复制它。
例子:
但是,在上面的示例中,c
是一个新数组,因此如果您修改a
or的某些元素b
,则根本不会修改它c
。
我希望c
(即c[0]
,c[1]
等)的每个索引都引用a
and的每个元素b
,但就像一个指针,而不是deepcopy
数据。
android - 软引用在 Android 上的行为不符合预期
在 Android 上使用软引用时遇到了一个奇怪的问题。我实现了一个位图缓存类,源码如下:
但是通过logcat发现软引用被频繁收集。日志是:
据我所知,只有当java堆增长到极限并且没有空间用于新的内存分配时,GC才会收集软引用。
但是,为什么 Android 上的软引用不符合预期呢?
java - 弱引用和软引用
弱引用允许 GC 在下一个 GC 循环中收集引用,而软引用将保留引用直到内存已满,并且在抛出内存错误之前,它将删除软引用。我们将在哪里使用这些参考资料?哪个参考最适合实现缓存?例如:如果我使用软引用进行缓存,那么当内存已满时它将被清除。但是让我们假设,我已经获取了一些数据库详细信息并将其放入内存并将该详细信息缓存在软引用中,现在如果我从内存中删除了一些键值,它仍然会存在缓存中。我们需要在此使用弱引用吗案例?应该如何做出决定。
java - OOM 错误和奇怪的 SoftReferences
我有运行在 HotSpot jvm 1.8.0_45 上的应用程序,具有良好的 8GB 堆。应用程序尝试为新对象分配内存失败并出现堆空间 OOM 错误。我查看了堆转储,发现大部分空间被 T4CConnection 实例的 charBufferCaches 占用。此缓存保存 char 数组的 SoftReference。我很惊讶 SoftReferences 没有在 OOM 之前发布。我仔细检查了这个数组是否有硬引用,但没有找到。
当应用程序通过 SoftReferences 保存 3GB 的字符数组时,为什么我有堆空间 OOM?为什么当应用程序需要新内存时这个 SoftReferences 没有被释放?
显示 charBufferCache 的 T4CConnection 对象的一部分:
T4CConnection charBufferCache 中保存的 char 数组的传入引用:
java - 在 SoftReference 的引用上覆盖 finalize 以保持数据活动是否有任何问题?
所以我正在编写从数据库中提取对象的代码。其中一些物体非常重。我需要一种方法来缓存它们。为此,我指的是SoftReference
.
但是,外部力量有可能在当前线程不知情的情况下作用于数据库并从数据库中删除该对象。如果发生这种情况并SoftReference
收集到,我想要做的是降低丢失对象的风险。
为此,我写了这段代码
总而言之,当您最初从数据库中拉下对象时,它被放入 aHolder
中,这是 a 的所指对象SoftReference
。hardRef
将null
在此时,并且该long
值将用作“锚”以在必要时从数据库中拉下对象。
一旦内存变得紧张,SoftReference
可能会被收集。但是,在此之前,我想检查该对象是否仍然存在于数据库端。如果没有,那么我想将本地维护的对象转移到hardRef
并将其设置SoftReference
为null
.
如果对象仍在数据库中,那么我们可以允许收集所指对象。下次我们需要召回对象时,我们将使用 longID 去获取它。(请注意,如果在那之后,有人删除了它,那么我可以抛出异常)。
这行得通吗?换句话说,我可以期望 Holder.referent 为非 null 并且能够在没有任何数据竞争的情况下将 hardRef 设置为该值吗?
我会期望看到任何显着的性能下降吗?我知道 finalize 有一些开销,但只要我不让事情陷入僵局,我认为我们没问题。
我问这个问题是因为每个人似乎都说 finalize() 是邪恶的,我永远不应该使用它。问题是,我只是看不到任何其他方式。
java - ReferenceQueue 适合对象池吗?
我想在我的库中使用缓冲池,并考虑使用SoftReference
s 来实现对象的隐式返回和池大小平衡。
所以,我所说的“合适”是指:
- 例如,与显式 ArrayBlockingQueue 相比,它们的性能是否相当好?(小于数量级)
- 它们在现代 VM(如 Hotspot、Dalvik 和 ART)中是否足够可靠,可以表现得比
WeakReference
s 更“软”?
对我来说,这不是“过早的优化”,只是一种架构选择,可以减少将对象返回到池中的麻烦,但如果不满足特定要求,则会否定池的任何好处。
java-8 - 如何刷新软引用以避免元空间 OOM?
我在 JDK 中面临 Metaspace OOM。有这么多的 SoftRefence 自定义类加载器应该在 Metaspace OOM 之前被刷新,但不知道为什么它没有发生?
有什么方法可以刷新 JDK8 元空间中的 SoftReferences?