之間的不同,我覺得在這個link 文檔它描述如下:什麼的WeakReference和SoftReference的
弱引用是應該有自己的條目自動刪除,一旦他們不被引用的話(從外部)的映射有用。 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儲備的一半sofereference每個GC過程中,我複製別人的測試代碼測試
最終的ArrayList>列表=新的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的所有日誌都是我的想法。
你說得對。我找到了保留碼「if(!marked &&((++ counter)&1))」。dalvikvm保留每個GC程序 – jerry
的一半參照。無論系統的狀態如何,每個GC都會丟失一半軟引用。對應用程序開發人員不太有用。 – fadden
但是爲什麼?爲什麼不使用FILO,我認爲那會更好地讓程序保持它所需要的 – jerry