排查内存泄漏最简单和直观的方法

作者&投稿:壹田 (若有异议请与网页底部的电邮联系)
~ 内存泄漏无疑会严重影响用户体验,一些本应该废弃的资源和对象无法被释放,导致手机内存的浪费,app使用的卡顿,那么如何排查内存泄漏呢?

当然,首先我门有google的官方文档可以参考:

大部分博客的方法也来自于此。总的来说,就是使用android studio 的monitor memory功能监测app主进程占用的内存,触发GC操作,而后观察内存的占用情况,如果在使用的过程中内存不断增加,没有回落, 很有可能 发生了内存泄漏,这时候就需要导出内存分配的具体详情进行深入分析了。

但是事实上,通过观察这个内存曲线的曾场来或者是观察allocate tracker中的allocate data数值的增长来检测是否有内存泄漏问题,真的很玄,因为往往内存泄漏发生了,但是GC仍然可以通过回收其他对象的方式腾出空间,导致这个数据的变化基本看不出来,甚至是减小的,所以我觉得这种方式, 就像是让你用手掌去感知婴儿的体温,去检测确定这个婴儿有没有发烧一样,非常不靠谱不准确。

那么,重点来了,我的方法,简单直观,保准你一学就会!

先说一个terminal指令: 

这条指令是用来查询这个进程所占用的内存的具体详情的,通过这条指令可以看到当前app在手机中占用的具体的堆内存大小,view的数量, activity的数量 ,等等。如下图:

其中activity数目是非常关键的一个信息,可以帮助我们快速地检测出内存泄漏。我们可以反复地进入退出需要测试的目标activity,如果在反复进入退出之后,用terminal执行上面的语句查询当前的内存情况,如果发现activity数量一直在增长,那么内存泄露一定是发生了!

内存泄漏已经发生,如何定位原因呢?

如下图,在android studio中开始memory monitor,点击init GC,反复进入退出发生了内存泄漏的activity,这时候点击生成内存文件,这之后android studio会自动打开生成的.hprof文件。选中该文件转化成标准的hrof文件。

用MAT工具打开生成的.hprof文件,点击如下所示的图标,可以看到内存中的对象列表。

考虑到大内存的泄漏都是因为Activity被destroy之后却仍然被其他对象持有而造成的,因此首先解决棘手问题,直接搜索Activity,如下。发现有Activity的实例个数是3,跟实际不符,明显这个activity导致内存泄漏了,按照如图的方式找到它的引用,也就是导致内存泄漏的幕后凶手!

可以看到这个例子中的内存泄漏是由一个HandlerThread引发的,那么找到这个问题的位置,在合适的地方(如ondestroy)将这个handler thread释放即可。

如下图所示: 在android studio中打开生成的hprof文件,在右侧边栏会出现的Analyzer Tasks工具,点击执行图标,即可出现检测分析的结果,得到哪些activity被泄漏了,这些被泄漏的activity被谁引用了。

可以看到内存泄漏由AsyncHandler引起,需要在activity生命周期结束的时候进行释放。

方法2不用安装MAT工具,更加便捷哦~

 有问题可以留言,谢谢您的阅读~~


Android开发中,有哪些好方法可以检测内存泄露和性能?
通过Android Studio自带的界面,查看内存泄露还不是很智能,我们可以借助第三方工具,常见的工具就是MAT了,这里我们需要下载独立版的MAT. 下图是MAT一开始打开的界面, 这里需要提醒大家的是,MAT并不会准确地告诉我们哪里发生了内存泄漏,而是会提供一大堆的数据和线索,我们需要自己去分析这些数据来去判断到底...

GDB与动态内存分析:检测内存泄漏和越界访问的方法与实践
在软件开发中,内存错误频发,特别是C\/C++等语言,内存泄漏和越界访问是常见问题。GDB,强大的GNU Debugger,不仅用于调试,还能协助动态内存分析,本文将详细介绍其实用技巧。1. 内存管理与检测理解内存分配与管理至关重要。C\/C++中的malloc和free虽灵活,但可能导致内存问题。为了有效管理,我们需要理解...

C++简单内存泄漏检查机制实现
这里是一个简单的内存泄漏自动检查机制。只适用于单线程情况下。工作原理就是将已经分配的内存用一个双向链表串联起来,释放内存时从链表里删除。在程序退出时,将链表中未释放的内存打印出来。同时在内存块中保存文件名和行号,用于定位内存分配地址。001 \/\/ placement_new.cpp : Defines the entry point...

检查内存是什么意思?
检查内存是指通过使用特定的工具检查计算机的内存使用情况,以了解计算机运行时内存的泄漏或占用情况。计算机内存是一种特殊的计算机硬件,用于存储数据和指令,以便计算机可以快速访问这些信息。在日常使用计算机时,我们可能会发现计算机运行缓慢,这时就可以通过检查内存来确定是否存在内存问题。同时,检查内存也...

嵌入式linux内存泄漏排查工具Valgrind
其中,--tool=memcheck --leak-check=yes 选择内存检查工具并启用内存泄漏检测,.\/my_program 是待检测的程序。运行后,Valgrind会输出详细的内存使用报告,包括问题的定位和解决建议。由于嵌入式设备通常没有图形界面,结果会通过串口等连接方式查看。然而,由于Valgrind可能对系统性能产生影响,开发者需要在...

常见的内存泄漏原因及解决方法
通常我们可以借助MAT、LeakCanary等工具来检测应用程序是否存在内存泄漏。 1、MAT是一款强大的内存分析工具,功能繁多而复杂。 2、LeakCanary则是由Square开源的一款轻量级的第三方内存泄漏检测工具,当检测到程序中产生内存泄漏时,它将以最直观的方式告诉我们哪里产生了内存泄漏和导致谁泄漏了而不能被...

如何测试软件的内存泄露呢,是有什么工具吗
这样,当程序结束的时候,list中剩余的指针就是指向那些没有被释放的内存。这里只是简单的描述了检测内存泄漏的基本原理,详细的算法可以参见Steve Maguire的<<Writing Solid Code>>。如果要检测堆内存的泄漏,那么需要截获住malloc\/realloc\/free和new\/delete就可以了(其实new\/delete最终也是用malloc\/free的...

【C语言】关于内存泄漏的那些事
错误3:func_ret_ptr返回内存首地址后没有作free处理,造成内存泄漏 错误4:如果某个结构化元素需要申请堆内存,同时结构化元素内部也需要申请堆内存,释放时单纯释放了p_param结构体的内存,遗漏了p_content指针所指向的内存,一旦p_param被释放,p_content保存的地址也无从查起,造成内存泄漏。6 总结...

Android开发中,有什么工具能够排查jni层的内存泄漏
注意这条信息中的 “ 3571K\/9991K” 值,这代表着程序使用的heap大小,如果这个值一直在增加,而从来不减小,那么就代表着你的程序存在着内存泄漏。2. DDMS的Heap信息 Eclipse开发环境还提供了一种更加直观的方法来查看App的Heap信息,操作方式如下:(1) 连接手机,运行程序,假设是 com.ticktick....

如何检查C++中的内存泄漏
如何检查C++中的内存泄漏 内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:1.分配完内存后忘记回收2.代码有问题,造成想回收却无法回收,例如:int* p=new int;p=new int; \/\/p指针修改,原来申请内存的地址没有记录下来,于是无法释放 下面介绍如何检查内存泄漏:1.包含头文件和定义...

南京市13189655092: win10内存泄漏,有没有必要重装系统 -
解枝脑安: 引起内存泄漏可能是由于一些软件进程,或者是驱动程序.所以没有必要一定重装系统.排查方法:1,打开任务管理器,切换到“详细信息”选项卡2,在进程列表顶部的表头(即“名称”、“PID”、“状态”等这一行字)上点击右键,选择“选择列”3,选中“工作集(内存)”和“工作集增量(内存)”这两项4,随后进程列表中会显示这两个新增的参数5,在列表顶部的表头处点击新添加的这两列的名称,按照对应数值的大小进行降序排列6,看看这两项降序排列后,排名靠前的分别是什么进程.检测到什么进程后,再尝试关闭这些进程,或找到进程对应的程序解决.驱动问题尝试更新所有驱动程序,包括网卡驱动.看内存泄漏问题是否解决.

南京市13189655092: 如何检查C++中的内存泄漏 -
解枝脑安: 如何检查C++中的内存泄漏 内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:1.分配完内存后忘记回收2.代码有问题,造成想回收却无法回收,例如:int* p=new int; p=new int; //p指针修改,原来申请内存的地址没有记录下来,于...

南京市13189655092: 如何排查Java内存泄露 -
解枝脑安: 1、首先我把JVM内存调小,便于在最短的时间内发现问题,利用jstat观察JVM内存回收的情况和使用情况,期间发现旧生代内存的申请在一直进行,但是GC基本回收不回来内存,所以很坚信如果JVM没有BUG的情况下,肯定是存在内存泄漏的...

南京市13189655092: 一般怎么检查内存泄露?
解枝脑安: xcode有个测试内存泄漏的工具,Instruments的Leaks就是了

南京市13189655092: 实时运行的程序如何检查内存泄露 -
解枝脑安: 本文浅谈一下C++内存泄漏的检测,首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复.最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck工具,功能非常强大,相信做C++开发的人都离不

南京市13189655092: eclipse工程怎么检查内存泄露 -
解枝脑安: 1、设置JVM参数,-XX:+HeapDumpOnOutOfMemoryError,在内存溢出的时候就会生成Heap dump文件2、使用jmap.(windows可以通过任务管理器查看pid) Java5:jmap -heap:format=b ;Java6:jmap -dump:format=b,file=HeapDump.bin 3、在本机运行java程序的时候,直接通过Memory Analyzer生成Heap dump文件.

南京市13189655092: 电脑故障有那些,怎么处理? -
解枝脑安: 一、如何检测电脑故障 在教MM们如何排除故障之前,当然先要学会如何检测故障所在了.如果像是外面电脑城检测的办法,通常会有Dbug卡或者专业的软件检测故障,这样的方法很直观地,就能发现问题的所在.但是Dbug卡或者专业的检测...

南京市13189655092: 服务器,存储排查故障的方法有哪些 -
解枝脑安: 1、检查电源线和各种I/O接线是否连接正常. 2、检查连接电源线后主板是否加电. 3、将服务器设为最小配置(只接单颗cpu,最少的内存,只连接显示器和键盘)直接短接主板开关跳线,看看是否能够启动.我用的是小鸟云服务器,感觉挺好的.你可以试下.

南京市13189655092: vs2012如何检查内存泄露
解枝脑安: 首先,在文件头添加下面的内容: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) #else #define DEBUG_CLIENTBLOCK #endif #define _CRTDBG_MAP_ALLOC #include &lt;stdlib.h&gt; #...

南京市13189655092: codeblocks怎么检查内存泄露 -
解枝脑安: codeblocks的话,点setting ,compiler and debugger ,选executable Toolchain 然后会有一行设置编译器的path ,你点一下右边的auto detect. 如果有编译器的话,就会自动设置好了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网