概述
- 前言
Android 内存优化杂谈
- 内存设备发展
Facebook有一个叫 device-year-class的开源库 ,它会用年份来区分设备的性能
- 手机内存
- 名词解释:
- DDR (Double Data Rate)双倍速率
- LPDDR RAM(Lower Power Double Data Rate RAM)低功耗双倍数据速率内存
- 宽带 = 时钟速率 x 内存总线位数 ÷ 8 = 12.8GB/s,因为双倍速率故最终为12.8GB/s x 2 = 25.6 GB/s
- 名词解释:
类型 | 时钟频率 | 宽带 | 工作电压 |
LPDDR3 | 800MHZ | 12.8GB/s | 1.2V |
LPDDR4 | 1600MHZ | 25.6GB/s | 1.1V |
LPDDR4X | 1600MHZ | 25.6GB/s | 0.6V |
- 内存引发的问题
- 异常
- 卡顿
- 通过发送SIGQUIT信号获得ANR日志
adb shell kill -S QUIT PID
adb pull /data/anr/traces.txt
包含信息
sticky concurrent mark sweep paused: Sum: 5.491ms 99% C.I. 1.464ms-2.133ms Avg:
1.830ms Max: 2.133ms // GC 暂停时间
Total time spent in GC: 502.251ms // GC 总耗时
Mean GC size throughput: 92MB/s // GC 吞吐量
Mean GC object throughput: 1.54702e+06 objects/s
- Android Bitmap内存分配的变化
- Android 3.0之前Bitmap对象放在Java堆,而像素数据是放在Native内存中,需要手动调用recycle
- Android 3.0 ~ Android 7.0 将Bitmap对象和像素数据都放在Java堆中,会随对象一起被回收
- Android 8.0将像素数据放到Native内存中,使用Hardware Bitmap 减少图片内存并提升绘制
Fresco 图片库就是在Dalvik会把图片放到Native内存中
- 测量内存方法
- 参考Android Developer中《调查RAM使用情况》
- adb shell dumpsys meminfo <package_name|pid> [-d]
- Java 内存分配
- 分析工具 Allocation Tracker 和 MAT
- Allocation Tracker缺点 -- 《Android 内存申请分析》
- Dalvik 和 ART中,Allocation Tracker 的开启方式
- 参考Android Developer中《调查RAM使用情况》
// dalvik
bool dvmEnableAllocTracker()
// art
void setAllocTrackingEnabled()
- Native内存分配 --- 《调试本地内存使用》
- Malloc调试
- Android8.0之后支持在非root的设备做Nativie内存调试,但是需要wrap.sh做包装
- adb shell setprop wrap.<APP> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"'
- Android8.0之后支持在非root的设备做Nativie内存调试,但是需要wrap.sh做包装
- Google弃Valgrind建议使用AddressSanitize,在Android8.0上可根据指南来使用
- Malloc调试
- Malloc钩子
- 在Android P之后,Android 的 libc支持拦截在程序执行期间发生的所有分配/释放调用,这样就可以构建出自定义的内存检测工具
adb shell setprop wrap.<APP> '"LIBC_HOOKS_ENABLE=1"'
最后
以上就是如意百合为你收集整理的课程总结4-内存优化1的全部内容,希望文章能够帮你解决课程总结4-内存优化1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复