天天看点

移动App性能测评与优化1.3.1 Dalvik Heap内部机制

<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 释放内存回系统的代码(二)

继续阅读