使用MAT分析android项目内存泄露总结

Android常见内存泄露分析及MAT与Profiler内存分析时间 1.Java内存分配策略 Java程序运行时的内存分配策略有三种:静态分配、栈式分配和堆式分配。对应的存储区域如下: 静态存储区(方法区):主要存放静态数据、全局static数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。 栈区:方法体内的局部变量都在栈上创建,并在方法执行结束时这些局部变量所持有的内存都会自动被释放。 堆区:又称动态内存分配,通常就是指在程序运行时直接new出来的内存。这部分内存在不使用时将会由Java垃圾回收器来负责回收。 2.堆与栈的区别 栈内存: 阅读详情

MAT是个十分强大的内存分析工具,集成在ADT DDMS中。

1.Update Heap查看进程内存情况

点击这个图标,再点击下方”Cause GC"按键

上图中,HeapSize就是虚拟机的堆大小,Allocated就是已使用内存大小;

而下面的表格中,"data object"是进程中所有对象的总数和占用内存的总大小,"1-byte array(byte[], boolean[])"用来查看bitmap的C层内存占用情况,这两项是检测程序内存泄露的最重要的指标,当单个activity或fragment反复进出,这两项数据保持上升而不恢复,那就可能就是这activity或fragment有泄露了。



2.MAT使用实例

下面是一个内存泄露的例子:

主Activity:

public class TestActivity extends Activity{
	private String str1 = "123";
        private String str2 = "456";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test);
		
		TestClass.getInstance().setString(str1 );
		
	}

}


测试class:

public class TestClass {
	public static TestClass mInstance;
	public static String mString;
	
	private TestClass(){
		
	}
	
	public static TestClass getInstance(){
		if(mInstance==null){
			mInstance = new TestClass();
		}
		return mInstance;
	}
	
	public void setString(String str){
		mString = str<span style="font-family: Arial, Helvetica, sans-serif;">;</span>
	}
	
	
}
可以看到,TestActivity创建时把成员变量str传递给外部类,并被TestClass静态变量mString引用保存起来,当TestActivity要关闭时,因为其成员被外部类TestClass引用,所以无法销毁TestActivity,从而导致内存泄露。


下面就用MAT去分析:
(1)反复进出TestActivity 2次,点击"Dump HPROF file"图标,把hprof文件dump下来并通过MAT解析文件



(2)hprof文件解析并显示如下:


中间的饼状图统计了进程中内存的主要分配情况,不同的颜色碎块标注的是占了较多内存的类,而分析用到的主要是下述用到的选项:

Histogram —— 列出每个类的实例数量和内存占用情况

Dominator Tree —— 从大到小列出对象及其内存占用情况

Leak Suspects —— 统计内存泄露怀疑的部分(主要是分析哪些是内存大量堆积的实例)


(3)本例子中因为TestActivity占用内存较少,所以Leak Suspects模块难以有效快速地找出泄露点,因此这里我们进入Histogram模块,并搜索TestActivity,结果如下:


可以看到这类存在了2个TestActivity,这就是意味着第一次启动的TestActivity未完全销毁。右键弹出菜单,选择“List Objects—>with outgoing reference”就会列出这个类的所有实例及其相关实例(成员变量等)。


推理逐个查找,直至找到怀疑的对象str1,并右键选择“List Objects—>with incoming reference”,显示如下:


这里就看到了我们的str1被TestClass.mString变量引用了,至此我们就找到了泄露的点了,可以执行相应的解决方案了。




PS:初步使用MAT,以此作为总结文档,若有勘误,欢迎各位指正(图片上传不了。。。。。。。)

Android内存分析工具(三):MAT Histogram:以下图示为分析内存泄露过程Histogram对比: 如上图,为查找内存泄漏,通常需要两个 Dump结果作对比,打开 Navigator History面板,将两个表的 Histogram结果都添加到 Compare Basket中去 如上图,添加好后,打开 Compare Basket面板,得到结果 如上图,点击右上角的 ! 按钮,将得到比对结果 如上图,为更方便查找差 阅读详情

相关推荐

android 如何分析应用的内存(十七)——使用MAT查看Android堆

前一篇文章,介绍了使用Android profiler中的memory profiler来查看Android的堆情况。如Android 堆中有哪些对象,这些对象的引用情况是什么样子的。可是我们依然面临一个比较严峻的挑战:不管是app开发者,还是内存分析者而言,堆中的对象,非常之多,不仅有Android 原生的类,还有第三方库使用的类。这些类在使用过程中,也可能因为有较大的shallow size 或者retained size而混淆内存的分析。

安仔的博客 2126

Android内存知识及用MAT工具定位内存泄漏的方法

Java内存 Java管理的内存分两种, 堆和栈. 栈是保存函数形参和局部变量的地方, 栈里保存的是对象的引用. 一个正在执行的函数总是存放在栈的最 上层.每个线程都有自己的调用栈. 堆上存放着所有java程序通过”new”操作符创建的对象, 数组也存放在堆里. Java虚拟机把堆按照 某种逻辑分成不同的区域来存放对象, 以便垃圾回收器能更快速有效的回收这些对象.

wenwei的博客 1854

【白话系列】倍增算法

【序言】         我认为吧,所有能够优化复杂度的算法都是神奇的,所有能够化繁琐为形象的文字都是伟大的。一直觉得倍增算法是个很神奇的东西,所以决定写点东西纪念一下它。但是作为一个非常不称职的OIER,我非常讨厌在看别人的算法解析时整版的i,j,k等我看到鼠标就惯性移到右上角的符号语言,所以我想用最形象的方式来纪念它。 【一】         从前,有一只可爱得不得了的小白兔,它想从

JarjingX 3万+

内存泄漏检测分析工具MAT(Memory Analyzer Tool)的使用

工具下载地址:https://www.eclipse.org/mat/ 首先准备一个案例demo。上次讲了经典Handler导致的内存泄漏,今天也讲个经典例子。单例造成的内存泄漏。 public class MySingleton { private static volatile MySingleton instance; private Context...

alcoholdi的专栏 1万+

Win10/Win11共享打印机0x00000709终极修复指南:从注册表到LPD协议的全面解决方案

本文提供了Win10/Win11共享打印机0x00000709错误的终极修复指南,涵盖从注册表修改到LPD协议的全面解决方案。通过详细分析错误根源、基础修复四步法、高阶LPD协议方案及企业级深度修复策略,帮助用户彻底解决打印机共享问题,提升局域网打印效率。

weixin_33724046的博客 309

自定义LayoutManager实现android-pile-layout滑动卡片堆叠效果

这是我的第一篇博客,总算有个契机开始写博客了,就从自定义LayoutManager开始吧。 前段时间看到一个项目(android-pile-layout),效果特别不错,这是效果图: 效果确实不错,我看了下实现,是用的自定义的ViewGroup实现的,计算什么还搞的挺复杂的,具体的没细看。作者说也尝试过用LayoutManager实现,但是没找到合适的数学模型,好吧,看到数学模型我

u014296305的博客 1万+

jvm_调优and享学gc

jvm 调优

weixin_48155735的博客 305

Vue3 - 完美解决高德地图定位失败 Get ipLocation failed.Geolocation permission denied.(获取ipLocation失败。地理定位权限被拒绝。)

Get ipLocation failed.Geolocation permission denied.,vue3引入高德地图当前定位失败 ,vue3中使用高德地图定位报错,高德地图API用户定位失败,高德地图H5 定位失败报错排查和解决方案,微信公众号H5网页高德地图定位报错,谷歌浏览器-高德地图定位失败geolocation,getCurrentPosition 返回的 message报错,如何解决此问题,uniapp h5高德地图,微信、QQ等内置浏览器定位失败,高德地图实现实时用户位置定位,引入高德

🏆 前端领域优质创作者 4168

JVM调优三板斧,快速掌握调优的核心与思路

如何从调优小白走向调优高手 说起JVM调优,大伙儿可能瞬间头皮发麻。"好家伙,和调优沾边儿的事儿,不是我这个段位的小新手能解决的"。 于是赶紧找来了技术大拿,看大拿三下五除二排查出了问题原因,给出了优化方案。此时,我们的眼里放着光,一脸崇拜的望着大拿,幻想着哪天能成为他这样出色的大佬。 这篇文章,就是让你学会调优,掌握一个属于自己的调优节奏与思路。 快速了解调优 如果你对调优没有什么概念,那么我们先说说调优是什么。 所谓调优,就是你的系统生病了。此时,我们就是一个诊所。系统找我们来治治病。 我

weixin_47184173的博客 5266

DFI协议时序

参数名称典型值应用场景关键影响tcmd_lat1-2个时钟周期命令与地址锁存同步地址错误风险tphy_wrlat1-2个时钟周期写操作响应速度写带宽与延迟2-3个时钟周期写操作端到端延迟系统吞吐量1-2个时钟周期连续写命令间隔信号干扰与资源冲突tphy_rdlat1-2个时钟周期读操作响应速度读带宽与延迟trddata_en由CL决定(如0.41 ns)读数据返回时间系统延迟10-20 ps写数据与命令对齐数据丢失风险<1 µs低功耗模式切换。

qq_43134430的博客 5101

YOLOv8多传感器融合技术——摄像头阵列融合技术详解

本文详细介绍了基于YOLOv8的摄像头阵列融合技术,该技术通过多摄像头协同工作实现360度无死角环境感知。文章阐述了系统原理,包括全方位视野覆盖、冗余设计和深度感知等优势,并提供了完整的Python实现代码。关键技术涵盖多摄像头检测、立体匹配、3D投影和目标融合等模块,支持时间域融合提升稳定性。该系统可显著提高自动驾驶的环境感知能力,减少检测盲区,增强系统可靠性,是L4-L5级自动驾驶的关键技术之一。文章还展示了城市驾驶场景的实际应用,验证了该技术对复杂交通环境的适应能力。

u010117029的博客 213

没有打印日志时,排查生产问题,怎么办?

有时候,系统出了bug,我们又没有打印日志 1. dump堆文件 jmap -dump:live,format=b,file=${文件名}${PID} 注意 1.执行jmap命令的用户要与 要dump堆文件java进程的启动用户是一致的。 2. jamp命令的jdk版本要与启动java进程的jdk版本也是一致的。 2. MAT导入堆文件 3. 编写OQL语句,查找对象 4. 执行OQL语句 点击MAT顶部菜单OQL select * from com.fintell.charge..

zqz_zqz的博客 1606

书旗app字符串加密分析

本文案例是对书旗app搜索接口的请求密文进行分析和逆向。

李玺 3155

Android 性能优化之使用MAT分析内存泄露问题

转载请注明本文出自xiaanming的博客(http://blog.youkuaiyun.com/xiaanming/article/details/42396507),请尊重他人的辛勤劳动成果,谢谢! 我们平常在开发Android应用程序的时候,稍有不慎就有可能产生OOM,虽然JAVA有垃圾回收机,但也不能杜绝内存泄露,内存溢出等问题,随着科技的进步,移动设备的内存也越来越大了,但由于Androi

u012075083的博客 321

Python操作WPS文档

在Python中,我们可以使用第三方库来操作WPS文档,实现自动化的文档处理。本文将介绍如何使用Python来打开、读取、修改和保存WPS文档的内容。库,我们可以打开、读取、修改和保存WPS文档的内容。你可以根据自己的需求进一步扩展和优化这些代码,实现更复杂的文档处理功能。安装完成后,我们就可以开始使用它来操作WPS文档了。方法将修改后的文档保存到指定的路径。方法将修改后的文档保存到指定的路径。在上面的代码中,我们通过修改段落的。属性,可以改变段落的文本内容。完成对文档的修改后,我们可以使用。

2301_79366177的博客 5615

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android开发—内存优化(初步)

这篇文章是关于这两天Android内存优化学习的记录,包括Android内存泄露的原因,Eclipse MAT工具的使用等。参考文章: http://blog.tisa7.com/tech/android_memory_management_and_solve_oom_problem.html 这篇文章写得很详细,很受益,我就拿里面几个我在项目中碰到的实例,来分析一下。 准备工具Eclipse M

very_caiing 631

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LeakCanary

LeakCanary 文章目录LeakCanary一、内容1. 使用方法2. 工作原理3.工作流程参考资料 一、内容 LeakCanary 是在 Android 项目中,用于检测内存泄露,优化性能的工具。 1. 使用方法 本文使用版本为 2.5 版本,相比于 2.0 之前的版本,2.0 之后的版本在使用上简洁了很多,只需要在 dependencies 添加 LeakCanary 依赖项即可。 dependencies { debugImplementation ("com.squareup.leakc

jjx_fight的博客 2954

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

你不知道的Eclipse的用法:使用MAT分析Android的内存

如果使用DDMS确实发现了我们程序中存在内存泄露,那如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾分析代码逻辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候。这里介绍一个极好的内存分析工具Memory Analyzer Tool(MAT)。  在Eclipse中安装和使用MAT步骤  Eclipse安装Allocation tracker插件

1024工场 2万+

结合Android Studio和MAT检测并简单分析内存泄露

1.什么是GC?在分析内存泄露之前首先要了解一下GC,GC(Garbage Collection)就是Java中常提到的垃圾回收,指的是JVM会自动回收不在被引用的内存数据。2.什么是GC Roots?GC Roots即Java虚拟机当前存活的对象集,其中的每一个对象可以作为一个GC Root。 在确定一个对象是否需要被回收时,常常会用到可达性分析算法,即通过判断对象的引用链是否可达来决定对象是否

Solinzon 1776

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

起初怀疑代码写的有问题. 仔细检测了下代码似乎写的并无漏洞. 出现这个问题那可能是某个地方出现了内存泄露. 创建的资源没有正常释放. 那如何分析内存溢出呢. Android提供了个很好的分析工具: Profiler。最近做了款Android小应用, 不断读取android的mic数据进行计算, 用于判断当前环境的噪音大小. 但是每运行到十几分钟后就莫名的闪退, 起初以为是程序些的不对导致的错误.这里可以查看你的应用具体占用了多少内存. 但是怎么看哪里发生了内测泄露呢?......

wqhjfree的专栏 1118

Android--内存泄露分析

一、内存泄露 java中的内存泄露是指一个无用对象持续占有内存或无用对象的内存得不到及时的释放,从而造成的内存控件的浪费称为内存泄露。 强引用(StrongReference):JVM 宁可抛出 OOM ,也不会让 GC 回收具有强引用的对象; 软引用(SoftReference):只有在内存空间不足时,才会被回的对象; 弱引用(WeakReference):在 GC(垃圾回收) 时,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存; 虚引用(Phant...

超宇的博客 2340

使用新版Android Studio检测内存泄露和性能

文/于连林520wcf(简书作者) 原文链接:http://www.jianshu.com/p/216b03c22bb8 内存泄露,是Android开发者最头疼的事。可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴。怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的Android Studio 检测内存非常方便, 如果结合上MAT工具

、不二的专栏 7338
上一篇: android开发内存泄露分析
下一篇: Android横竖屏切换和灭屏亮屏时Activity的生命周期探究
angusing
博客等级 码龄15年 11粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值