记得刚入职的第一天领导给了个bug让我分析一下 视频播放30分钟后直接crash,看了日志发现是OOM,对于刚入职的我项目不熟悉,代码不熟悉直接排查OOM范围就比较广泛了,只能利用工具先分析
关键异常截图:
理解OOM的定义:
常见的内存方面问题:
关注内存方面3个重要点:
内存分析相关工具:(4种)
1、adb shell dumpsys meminfo com.xxx.xxx
刚开始手机profile跑不起来,用adb宏观的查看内存基本情况
https://developer.android.com/studio/command-line/dumpsys
2、LeakCanary分析 默认分析activity泄漏
3、profile分析 ,不太好做对比
https://developer.android.com/studio/profile/memory-profiler#record-allocations
4、MAT分析,MAT下载地址
https://www.eclipse.org/mat/downloads.php
AndroidStudio Profiler heap dump方式
注:AndroidStudio的heap dump文件不能直接用MAT打开,需要配置环境变量
/Users/xxx/Library/Android/sdk/platform-tools
使用如下:hprof-conv -z 原文件.hprof 目标文件.hprof
MAT分析对象消耗内存大小
Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用;
Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收的内存大小;
https://www.iteye.com/blog/bjyzxxds-1532937
关于lruCache 重写sizeof和未重写sizeof源码解释:
/** * @param maxSize for caches that do not override {@link #sizeOf}, this is * the maximum number of entries in the cache. For all other caches, * this is the maximum sum of the sizes of the entries in this cache. */ 我的理解:重写和不重写sizeof
原因分析:
没有重写sizeof方法,那就是最大是10*1024 * 1024,每个ByteArray 1M
一个视频3.12G ,2小时43分钟 ,一分钟就是18M,20分钟就增加360M,
本身打开APP大概500M,所以30分钟会oom crash,性能差点的手机25分钟左右OOM,性能好点的手机30分钟 (1G了crash)
解决方案:
解决前VS解决后内存情况:
利用MAT分析内存泄漏 代码案例如下:
频繁进入退出activity heap dump不同时间段两份内存文件,转换后hprof-conv导入MAT,利用compare basket进行比较