移动App性能测评与优化1.5.3 dex mmap

    xiaoxiao2024-03-30  115

    1.5.3 dex mmap

    dex mmap在Android应用中的作用是映射classes.dex文件。Dalvik虚拟机需要从dex文件中加载类信息、字符串常量等,还需要在调用函数的时候直接从mmap内存中读取函数代码(dvm bytecode)来执行;所以该部分内存是程序运行必不可少的。

    以一个示例应用为例,我们能够在MAT中看到,应用加载了大约1500个class类型,而dex文件的class类型共有10635个。使用dex mmap动态统计功能统计后发现,虽然只加载了1500个类,但dex内存通常高达4~6MB,差不多是dex文件大小的一半,如表1-1所示。

    表1-1 dex内存的利用率

    启动后加载class数  总共class数      class数占比

    约1500 10635   14%

    启动后dex mmap内存   dex文件大小     dex文件大小占比

    约4~6MB   10.9MB 37%~55%

     

    从以上数据可以看到,很大一部分dex内存空间被浪费了,实际使用到的数据和代码并没有那么多,这是为什么呢?这是由于dex文件在生成时按字母顺序排列。由于4KB页面加载的原因,实际运行时会加载许多相邻但不会被用到的数据。例如在代码中使用了A1类,虚拟机就需要加载包含A1类数据的页面。但由于A1的数据只有1KB,那在加载的4KB页面中,还会有A2A3A4类,总共占用了4KB内存。

    假设我们的代码里在用到A1类后,还会用到B1、C1、D1类,那么如果能在dex文件中将A1、B1、C1、D1类放在一起,虚拟机就只需要加载一个4KB页面,不仅减少了内存使用,还对程序的运行速度有好处。因此,优化的思路就是调整dex文件中数据的顺序,将能够用到的数据紧密排列在一起。

    最新回复(0)