什么是内存泄漏
申请了一块内存空间,但是一直没有释放。如果不断的申请还会引起内存溢出(OOM)
什么是内存抖动
频繁的GC操作,如果垃圾回收的速度没有生成的快,也会引起OOM
如何检测?
我使用的是Profiler+Mat,前提是必须要ADB调试
MAT工具下载地址 (https://www.eclipse.org/mat/)
运行完Profiler会出现
点击MEMORY部分
点击下载 开始记录
生成
右键Heap Dump导出文件
然后将该文件通过sdk里的hprof-conv.exe转一下文件
注意:adb调试是在你的hprof-conv的目录下 将你生成的hprof文件转一下文件 目录就是生成temp.hprof文件以及生成mat需要的文件目录(任意目录)
打开Mat 点击MemoryAnalyzer.exe
点击File
之后点击Open Heap Dump... 选择生成的mat可以打开的memory.hprof文件
点击finish
点击标记
在该位置输入(Fragment|Activity 来排查你的Fragment|Activity的泄漏位置)
右键选择一个点击
这个表示GC Roots 所持有的所有的引用
也可以点击Merge Shortest Paths to GC Roots 点击 exclude all phantom/weak/soft etc.references 这个意思是排除软弱引用
查看强引用
之后就可以查看当前的页面持有什么强引用了
如何处理内存泄漏
一个图片就明白了
把当前持有GC root 与下一个持有的断开GC就可以释放当前内存