Android内存优化/内存泄漏排查

记得刚入职的第一天领导给了个bug让我分析一下  视频播放30分钟后直接crash,看了日志发现是OOM,对于刚入职的我项目不熟悉,代码不熟悉直接排查OOM范围就比较广泛了,只能利用工具先分析

关键异常截图:

 理解OOM的定义:

常见的内存方面问题: 

  1. 内存抖动
  2. 内存泄漏
  3. 内存溢出

关注内存方面3个重要点:

  1. 代码在jvm如何存在(栈帧)
  2. 某个对象在内存中到底占用多少内存
  3. 某个对象的生命周期;线程,application

 内存分析相关工具:(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 
  1. 不重写:是对最大数量的限制(最大10个,1个ByteArray1M)
  2. 重写:缓存中条目大小的最大总和

原因分析:

没有重写sizeof方法,那就是最大是10*1024 * 1024,每个ByteArray 1M  

一个视频3.12G ,2小时43分钟 ,一分钟就是18M,20分钟就增加360M,

本身打开APP大概500M,所以30分钟会oom crash,性能差点的手机25分钟左右OOM,性能好点的手机30分钟 1Gcrash

解决方案: 

解决前VS解决后内存情况:

利用MAT分析内存泄漏 代码案例如下:

 频繁进入退出activity heap dump不同时间段两份内存文件,转换后hprof-conv导入MAT,利用compare basket进行比较

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值