<b>1.3.1 dalvik heap内部機制</b>
為了弄清楚為什麼dvm占着記憶體不釋放,我們閱讀了dvm配置設定記憶體部分的代碼。位置在android源碼的dalvik/vm/alloc下,約255kb。分析的主要流程如下:
1)dvm使用mmap系統調用從系統配置設定大塊記憶體作為java
heap。根據系統機制,如果分類的記憶體尚未真正使用,就不計入privatedirty和pss。例如圖1-8所示,heap size/alloc很多,但大部分是共享的,實際使用的較少。是以反映到privatedirty/pss裡的記憶體并不多。
圖1-8 共享記憶體較多的程序
2)建立對象之後,由于要向對應的位址寫入資料,核心開始真正配置設定該位址對應的4kb實體記憶體頁面。
alloc.cpp中,從第176行起的代碼如圖1-9所示。
圖1-9 dvm虛拟機配置設定記憶體的代碼
3)運作一段時間後,開始垃圾回收(gc),有些對象被回收了,有些會一直存在,如圖1-10所示。
圖1-10 黑點表示的記憶體會被回收
4)在gc時,有可能會進行trim,即将空閑的實體頁面釋放回系統,表現為privatedirty/pss下降。heapsource.cpp中,第431行代碼如圖1-11所示。
圖1-11 釋放記憶體回系統的代碼(一)
heapsource.cpp中,第1304行代碼如圖1-12所示。
圖1-12 釋放記憶體回系統的代碼(二)