1.6 本章小结
在这一章里,我们通过对几个案例的分析,基本了解了Android应用的各种内存组成,以及这些成分是如何被消耗的,也总结出了一些节约和优化内存的经验。在这一小节里我们把经验都列出来供读者参考。
内存的主要组成索引:
Native Heap:Native代码分配的内存,虚拟机和Android框架本身也会分配
Dalvik Heap:Java代码分配的对象
Dalvik Other:类的数据结构和索引
so mmap:Native代码和常量
dex mmap:Java代码和常量
内存工具:
Android Studio/Memory Monitor:观察Dalvik内存
dumpsys meminfo:观察整体内存
smaps:观察整体内存的详细组成
Eclipse Memory Analyzer:详细分析Dalvik内存
测试经验:
MAT是探索Java堆并发现问题的好帮手,能够迅速发现常见的图片和大数组等问题。
仅靠MAT提供的功能也不是万能的,比如内存碎片问题就隐藏在对象的地址中。
要测试非Dalvik部分,有必要了解Linux的进程和内存原理、内存共享机制,熟悉常用命令行工具。
内存分配的最小单位是页面,通常为4KB,这个限制往往会引发各种碎片问题。
碎片不仅仅是Dalvik内存,包括各种文件的mmap也有可能产生碎片。
性能优化:
尽量不要在循环中创建很多临时变量。
可以将大型的循环拆散、分段或者按需执行。
引入SDK库和调用新的系统API时需要考虑成本。有可能一些不常用的功能会导致大量的消耗。这时候有可能需要多进程方案,将这些影响内存的操作放入临时进程执行。
除了Dalvik堆内存,还有其他类型的内存在了解了原理后也能够进行分析和优化。
dex文件有很多优化空间。在仔细统计并调整了dex文件的顺序后,往往能够节约1MB以上的mmap内存。