我在此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程序中保留一半的推荐,我将某人的测试代码复制到测试中
最终ArrayList> list = new ArrayList>(
SR_COUNT);
对于(int i = 0; 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中弱/软/幻象引用的最佳描述是在Java编程语言(“垃圾回收和内存”)的第17章中。
没有保留软引用的强制性政策。允许VM在GC期间或两者之间丢弃所有消息或不丢弃任何消息。唯一的要求是,VM应该在抛出OOM之前丢弃所有软可到达的对象。
您可以在MarkSweep.cpp的dvmHeapProcessReferences()
中继续Dalvik的逻辑。请特别注意对preserveSomeSoftReferences()
的调用,该调用保留了一些基于引用“颜色”的内容,而没有保留其他内容。您可以在wikipedia GC article上阅读有关颜色的更多信息。
关于android - WeakReference和SoftReference之间有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21830243/