官术网_书友最值得收藏!

1.3.1 Dalvik Heap內部機制

為了弄清楚為什么DVM占著內存不釋放,我們閱讀了DVM分配內存部分的代碼。位置在Android源碼的dalvik/vm/alloc下,約255KB。分析的主要流程如下:

1)DVM使用mmap系統(tǒng)調用從系統(tǒng)分配大塊內存作為Java Heap。根據(jù)系統(tǒng)機制,如果分類的內存尚未真正使用,就不計入PrivateDirty和Pss。例如圖1-8所示,Heap Size/Alloc很多,但大部分是共享的,實際使用的較少。所以反映到PrivateDirty/Pss里的內存并不多。

圖1-8 共享內存較多的進程

2)新建對象之后,由于要向對應的地址寫入數(shù)據(jù),內核開始真正分配該地址對應的4KB物理內存頁面。

Alloc.cpp中,從第176行起的代碼如圖1-9所示。

圖1-9 DVM虛擬機分配內存的代碼

3)運行一段時間后,開始垃圾回收(GC),有些對象被回收了,有些會一直存在,如圖1-10所示。

圖1-10 黑點表示的內存會被回收

4)在GC時,有可能會進行trim,即將空閑的物理頁面釋放回系統(tǒng),表現(xiàn)為PrivateDirty/Pss下降。HeapSource.cpp中,第431行代碼如圖1-11所示。

圖1-11 釋放內存回系統(tǒng)的代碼(一)

HeapSource.cpp中,第1304行代碼如圖1-12所示。

圖1-12 釋放內存回系統(tǒng)的代碼(二)

主站蜘蛛池模板: 商水县| 丽江市| 康马县| 顺义区| 仙游县| 灵璧县| 通化县| 辽阳市| 兴隆县| 昌黎县| 琼中| 普兰县| 奉贤区| 阳高县| 隆子县| 赤水市| 光泽县| 双江| 德钦县| 齐河县| 科技| 西平县| 阿巴嘎旗| 西充县| 霸州市| 武陟县| 吉隆县| 原阳县| 措勤县| 克拉玛依市| 武定县| 宝坻区| 潍坊市| 北碚区| 八宿县| 同德县| 车险| 绍兴市| 金溪县| 漳浦县| 安陆市|