【Android内存溢出分析工具MAT的使用】

Android内存溢出分析工具MAT的使用

一个安卓小项目

最近做了款Android小应用, 不断读取android的mic数据进行计算, 用于判断当前环境的噪音大小. 但是每运行到十几分钟后就莫名的闪退, 起初以为是程序些的不对导致的错误.

java.lang.OutOfMemoryError: Failed to allocate a 257909772 byte allocation with 4184720 free bytes and 231MB until OOM

起初怀疑代码写的有问题. 仔细检测了下代码似乎写的并无漏洞. 出现这个问题那可能是某个地方出现了内存泄露. 创建的资源没有正常释放. 那如何分析内存溢出呢. Android提供了个很好的分析工具: Profiler

抓取堆栈信息

在Android Studio底部打开Profiler
在这里插入图片描述
这里可以查看你的应用具体占用了多少内存. 但是怎么看哪里发生了内测泄露呢? 别着急接着看

首先点击内存占用这块的蓝色区域(如上图第三步)
然后进入记录堆栈信息页面, 点击"Capture heap dump"->Record开始记录堆栈信息
几分钟之后就会自动生成"Heap Dump".
点击旁边的保存图标保存到本地, 后缀为xxx.hprof.
在这里插入图片描述

内存分析

分析内存使用情况我们使用的是MAT(MAT下载地址)
导出的hprof文件跟MAT的格式要求不一致, 需要进行转换, 转换方法如下:
在你的SDK/platform-tools目录下运行(例如我本地的是3.hprof文件): hprof-conv 3.hprof 3_3.hprof
打开MAT并导入3_3.hprof文件.
在这里插入图片描述
选择"Dominator Tree"->点击"Retained Heap" 按大到小排序排第一的就是造成内测溢出的地方.
在这里插入图片描述
看到这里那你也能猜出你程序大概是哪个位置造成内测泄露.
刚看到elementData变量的时候我感觉很奇怪, 它是ArrayList内部的一个数组么, 然道是audioList频繁使用没被GC回收?
最后改造了下写法并手动释放最终修复了这个闪退问题.

参考文章

本文参考文章如下:

https://www.jianshu.com/p/5e7c3fa26cfb
https://blog.csdn.net/mingzaizai_123/article/details/118086390

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值