先把结论放在前面:内存优化的第一步不是"省内存",而是"知道自己用了多少、花在哪里"。大多数应用说不清自己的内存构成——Java 堆多少、Native 堆多少、Graphics 多少,其中图片占几成、缓存占几成。没有这张"内存画像",任何优化都是猜。 画像出来之后,才谈得上设水位、定预算、做治理。
面试里这题属于"内存专题的总纲"。答得浅的是"用dumpsys meminfo看内存";答得深的是能讲清进程内存的分区构成与各自的伸缩规则、三档水位(安全 / 警戒 / 危险)如何由onTrimMemory与系统可用内存共同决定、以及"缓存不是越大越好"这条反向约束的量化依据。
内存画像:先量清楚
Android 进程的内存不是一块,而是四块叠加,各自的伸缩规则不同。
| 分区 | 内容 | 谁来释放 | 伸缩特点 |
|---|---|---|---|
| Dalvik / ART 堆 | 对象、集合、类元数据 | GC | 受heapgrowthlimit与heapgrowthfactor影响 |
| Native 堆 | 图片像素、malloc、 |