我在此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.cppdvmHeapProcessReferences()中继续Dalvik的逻辑。请特别注意对preserveSomeSoftReferences()的调用,该调用保留了一些基于引用“颜色”的内容,而没有保留其他内容。您可以在wikipedia GC article上阅读有关颜色的更多信息。

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

10-11 03:05