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文件中数据的顺序,将能够用到的数据紧密排列在一起。
时间: 2024-10-27 07:40:10