gpt4 book ai didi

android - WeakReference 和 SoftReference 有什么区别

转载 作者:行者123 更新时间:2023-11-29 21:14:20 26 4
gpt4 key购买 nike

我在这个 link 上找到了文档描述如下:

弱引用对于映射很有用,一旦它们不再被引用(从外部),应该自动删除它们的条目。 SoftReference 和 WeakReference 之间的区别在于决定清除和排队引用的时间点:SoftReference 应该尽可能晚地被清除和入队,也就是说,以防 VM 有内存不足的危险。WeakReference 可能会在已知为弱引用后立即被清除并入队。

但是当我查看 Dalvikvm 的源代码时,在 dvmCollectGarbageInternal(Heap.cpp L446 Android 4.4) 函数中发现了一些东西。似乎有两个引用资料同时清除。

 /*
* All strongly-reachable objects have now been marked. Process
* weakly-reachable objects discovered while tracing.
*/
dvmHeapProcessReferences(&gcHeap->softReferences,
spec->doPreserve == false,
&gcHeap->weakReferences,
&gcHeap->finalizerReferences,
&gcHeap->phantomReferences);

我错过了什么吗?

============================================= =================================

在@fadden的帮助下,我找到了预约码

if (!marked && ((++counter) & 1))

dalvikvm在每个GC过程中都保留了一半的soferreference,我复制了别人的测试代码进行测试

最终的 ArrayList> list = new ArrayList>( SR_COUNT); 对于 (int i = 0; i < SR_COUNT;++i) { list.add(new SoftReference(new Integer(i)));

    /* Test */
for (int i = 0; i < 3; ++i) {
System.gc();

try {
Thread.sleep(200);
} catch (final InterruptedException e) {
}
}

/* Check */
int dead = 0;
for (final SoftReference<Integer> ref : list) {
if (ref.get() == null) {
++dead;
}
Log.d(TAG, "dead: " + dead);
}

logcat的所有日志都是我想的。

最佳答案

FWIW,Java 编程语言(“垃圾收集和内存”)的第 17 章是对 Java 中弱/软/幻象引用的最佳描述。

没有针对软引用保留的强制性政策。允许 VM 在 GC 期间全部丢弃或不丢弃,或介于两者之间的任何内容。唯一的要求是 VM 应该在抛出 OOM 之前丢弃所有可软访问的对象。

您可以在MarkSweep.cpp 中的dvmHeapProcessReferences() 中继续Dalvik 的逻辑| .请特别注意对 preserveSomeSoftReferences() 的调用,它保留了一些基于引用“颜色”的而不是其他的。您可以在 wikipedia GC article 上阅读有关颜色的更多信息.

关于android - WeakReference 和 SoftReference 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21830243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com