![移动App性能评测与优化](https://wfqqreader-1252317822.image.myqcloud.com/cover/107/840107/b_840107.jpg)
上QQ阅读APP看书,第一时间看更新
1.3.1 Dalvik Heap内部机制
为了弄清楚为什么DVM占着内存不释放,我们阅读了DVM分配内存部分的代码。位置在Android源码的dalvik/vm/alloc下,约255KB。分析的主要流程如下:
1)DVM使用mmap系统调用从系统分配大块内存作为Java Heap。根据系统机制,如果分类的内存尚未真正使用,就不计入PrivateDirty和Pss。例如图1-8所示,Heap Size/Alloc很多,但大部分是共享的,实际使用的较少。所以反映到PrivateDirty/Pss里的内存并不多。
![](https://epubservercos.yuewen.com/B6E540/5380295204741601/epubprivate/OEBPS/Images/figure_0031_0001.jpg?sign=1739641061-TBPG7o57IBC0sLCUAXiYD2qOcL4tB4s6-0-694f0a87a64c598881869b1e9a302346)
图1-8 共享内存较多的进程
2)新建对象之后,由于要向对应的地址写入数据,内核开始真正分配该地址对应的4KB物理内存页面。
Alloc.cpp中,从第176行起的代码如图1-9所示。
![](https://epubservercos.yuewen.com/B6E540/5380295204741601/epubprivate/OEBPS/Images/figure_0031_0002.jpg?sign=1739641061-iGtIHvtKsG7Jgq7uza73TWFq9W2IMEFh-0-a9c0e20c11d10f856203effe42c5da30)
图1-9 DVM虚拟机分配内存的代码
3)运行一段时间后,开始垃圾回收(GC),有些对象被回收了,有些会一直存在,如图1-10所示。
![](https://epubservercos.yuewen.com/B6E540/5380295204741601/epubprivate/OEBPS/Images/figure_0032_0001.jpg?sign=1739641061-K0PDTZTFVv3fp0Phy9dSjq3T0HxYHW9P-0-fa296e0fdfdcd3fde87f93a30d55fd5f)
图1-10 黑点表示的内存会被回收
4)在GC时,有可能会进行trim,即将空闲的物理页面释放回系统,表现为PrivateDirty/Pss下降。HeapSource.cpp中,第431行代码如图1-11所示。
![](https://epubservercos.yuewen.com/B6E540/5380295204741601/epubprivate/OEBPS/Images/figure_0032_0002.jpg?sign=1739641061-bIEf334cN05ExmfEmpnXaE6NGr0eVJDy-0-b09303cbc16a1386f37af98bb5aa1ce4)
图1-11 释放内存回系统的代码(一)
HeapSource.cpp中,第1304行代码如图1-12所示。
![](https://epubservercos.yuewen.com/B6E540/5380295204741601/epubprivate/OEBPS/Images/figure_0033_0001.jpg?sign=1739641061-TuCPqOITYDjdVJmbg4EcOFEVgZVoyVlR-0-7a9e45706167a1a36902b967a5f42aab)
图1-12 释放内存回系统的代码(二)