准备MAT工具:
工具地址 :
https://www.eclipse.org/mat/
这里有两种方式:一是以插件的方式集合到eclipse中,二是直接下载MemoryAnalyzer(免安装);
Android studio生成hprof文件:
对于生成hprof文件,Android studio 3.0之后的版本和3.0之前的版本可以说是完全不一样的,如果你使用过eclipse开发过Android,那就很容易知道的,这里就不详细介绍了。
这里以Android studio 3.0之后的版本来做说明。
点击如下按钮:
之后就会出现一个Android Profiler的控制面板,这里就是android studio给我们提供的内存分析的地方,关于Android Profiler的详细使用这里不做介绍,这里主要看MEMORY,点击如下红色区域:
接着就进入到了实时内存区域
上面三个标记按钮的作用:
1、内存回收;
2、堆转储,将此时堆内存中的对象记录导出到hprof文件中;
3、一段时间内堆内存中的分配记录,比如:点击开始,操作app,操作结束后,再次点击结束,这时就会生成一个记录了这段时间内堆中生成的对象。
这里要生成hprof文件,当然就是点击2了,之后就会出现一个堆记录面板,如下图:
在点击上面的红框按钮,就可以生成一个hprof的本地文件了,此时文件是生成了,如果这时就用MAT工具去打开,是会报错的,这时因为MAT是用来分析java文件的,与android studio导出的hprof文件有一点不同,这时就需要用到一个android sdk包下的一个工具hprof-conv.exe,将导出的hprof文件在进行转换一下,位置如下图:
接下来打开控制台,切换到hprof-conv.exe所在目录,执行:hprof-conv 源文件 输出文件,如下图:
这里的D:\album.hprof就是android studio导出的hprof文件,而D:\album1.hprof就是转换后的文件,这也是MAT可以打开的文件,这样整个流程就全部完成了,接下来要做的就是去分析了,这里先不做介绍,等待下一篇再来。
准备MAT工具:工具地址 : https://www.eclipse.org/mat/这里有两种方式:一是以插件的方式集合到eclipse中,二是直接下载MemoryAnalyzer(免安装);Android studio生成hprof文件:对于生成hprof文件,Android studio 3.0之后的版本和3.0之前的版本可以说是完全不一样的,如果你使用过eclipse开发过...
打开
Android
Studio
,
打开
Android
Device Monitor,
即
Android
Studio
-> Tools ->
Android
->
Android
Device Monitor,
选择要dump的进程,点击 "Dump H
PRO
F file"
这样就得到 了h
pro
f文件。
Android
Studio
与C++的内存不同,C++的
内存泄露
是由于分配了内存给某程序但是又没有回收造成的。Java的
内存泄露
则是引用了一些垃圾对象,意思就是说程序引用了某些对象,但是又从来没有使用过。
Jave中的引用分为3种:
强引用:引用为空的时候,Java的垃圾回收器会处理。一般来说自己写的程序大部分都是强引用。
软引用:堆内存不够的时候,Java的垃圾回收器会处理这类引用。
弱引用:Jav...
这里只介绍最新版本(v3.5)的
Android
studio
的生成
流程
,低版本的推荐:
Android
studio
导出
h
pro
f到
MAT
工具
流程
3.0之前,以及3.0之后和现在使用的3.5版本
流程
均不同,注意区分。
一.打开
pro
filer
二.
pro
filer中
导出
h
pro
f
H
pro
f基本概念
h
pro
f最初是由J2SE支持的一种二进制堆转储格式,h
pro
f文件保存了当前java堆上所有的内存使用信息,能够完整的反映虚拟机当前的内存状态。
H
pro
f文件由FixedHead和一系列的Record组成,Record包含字符串信息、类信息、栈信息、GcRoot信息、对象信息。每个Record都是由1个字节的Tag、4个字节的Time、4个字节的Length和Body组成,Tag表示该Record的类型,Body部分为该Record的内容,长度为Length。
Android
我们可以使用代码生成h
pro
f,然后使用批处理h
pro
f文件,然后用
MAT
进行对多个h
pro
f文件比较分析。
一、批处理配置文件
批处理配置文件config.bat如下:
rem the following var is for get
Pro
cessState.bat
set rawDatadir=rawData
set
pro
cessName=com.sec.
android
.app
2、其实和
android
内存分析 outOfMemoryError错误定位及分析策略(非显示图片造成) 中用eclipse前7步的设置一样,只不过这个速度更快一些,更方便一些(eclipse ddms模式下卡的要死要死~~~~)
3、用
mat
for mac(下载地址:http://www.eclipse.org/
mat
/downloads.p
Android
内存泄露
是指应用程序在不再使用某些对象时,由于某些原因(例如疏忽、 bug 或其他问题)导致该对象无法被垃圾回收器回收,从而导致系统内存资源的浪费。这可能会导致应用程序的性能下降或甚至崩溃。
为了分析
Android
内存泄露
,您可以使用
Android
Studio
的内存分析
工具
,这是一个内置的分析
工具
,可以帮助您找出导致
内存泄露
的问题。您还可以使用第三方
工具
,例如 LeakCanary 来检测
内存泄露
。
除了使用
工具
之外,您还可以通过查看堆转储快照并使用对象图分析泄露的对象来分析
内存泄露
。您还可以使用
Android
Studio
的 H
PRO
F Viewer
工具
来分析堆转储快照。
此外,您还可以通过遵循良好的编码实践来避免
内存泄露
,例如:
- 在不再使用对象时及时将其设置为 null。
- 在需要时使用弱引用来避免
内存泄露
。
- 在不再使用观察者对象时,取消观察者对象的注册。
- 在 Fragment 和 Activity 生命周期结束时,取消所有的异步任务。