内存问题
内存检测工具
Memory Profiler
Allocations 分配了多少对象
Shallow Size 我自己的大小
Retained Size 支配的大小
点击实例后 Allocation Call Stack 创建对象的位置
Memory Analyzer-MAT(堆转储)
java heap分析工具
dump一下heap,保存为文件,用hprof-conv转化
Histogram-搜索MemoryLeak,右键MemoryLeakActivity,
ListObject-with incoming reference-path to gc root
内存分配
Java内存分配
Java内存回收算法
- 标记-清除算法(标记和清除效率不高,产生大量不连续的内存碎片)
- 复制算法(浪费一半空间 )
- 将内存划分为大小相等的两块
- 一块内存用完之后复制存活对象到另一块
- 清理另外一块内存
- 标记-整理算法(内存连续避免标记-清理导致的内存碎片,避免复制算法的空间浪费)
- 分代收集算法
Android内存管理机制
Low Memory Killer
- 进程分类(优先级由高到低,低优先级先回收)
- 前台进程
- 可见进程
- 服务进程
- 后台进程
- 空进程
- 回收收益(确定回收多少)
ARTHook优雅检测不合理图片
26之后相当于java层销毁后很快能通知Native层去销毁
放在资源目录的话算内存还要考虑压缩比例
https://github.com/tiann/epic
Epic 是一个在虚拟机层面、以 Java Method 为粒度的 运行时 AOP Hook 框架。简单来说,Epic 就是 ART 上的 Dexposed(支持 Android 4.0 ~ 10.0)
https://github.com/codeguyFred/MyPerformance/blob/master/app/src/main/java/com/optimize/performance/PerformanceApp.java
https://github.com/codeguyFred/MyPerformance/blob/master/app/src/main/java/com/optimize/performance/memory/ImageHook.java
线上监控
- Debug.dumpHprofData()(Dump比较麻烦,上传失败率搞,分析困难)
ps:
LeakCanary定制