内存抖动
引起的原因:短时间内有大量对象创建与销毁,它伴随着频繁的GC。
内存抖动会引起频繁的gc,gc是会STW的,会暂停用户线程。
Android Studio 内置了性能监测工具Memory Monitor
A:手动触发GC操作
B:获取当前的堆栈信息,生成.hprof文件
C:内存分配追踪工具,生成.alloc文件
D:已使用内存
E:剩余可用内存
通过与应用交互并在Memory Monitor中观察它是如何影响内存的使用,图表可以为你展示一些潜在的问题:
1.频繁的垃圾收集活动使应用运行缓慢。
2.应用耗尽内存导致app崩溃.
3.潜在的内存泄漏
正常情况下,上图中的D区域会随着时间的走势慢慢上升(就算你与APP没有任何交互),直到E区域被用完,则会触发GC操作,释放内存,周而复始。如果你发现你的应用是静态的,但是E区域的内存很快就被用完了,即频繁的触发GC操作,这时你就应该引起重视,说不定你的代码中就存在着引起内存泄漏的隐患。
在Memory一栏中,可以观察不同时间App内存的动态使用情况,点击可以手动触发GC(点击上图A处),然后点击上图B处可以进入HPROF Viewer界面,查看Java的Heap,如下图
最后补充一个我遇到的例子
以上是我的例子,不断的从MainActivity跳到Main2Activity,很明显会因为Context导致内存泄漏,下面我们用Android Monitor来排查出来
然后进入到.hprof结尾的文件
内存泄漏,MAT检测内存泄漏实战
dump完成后Android studio会开启一个新的视图显示当前内存中的所有对象
导出hprof文件,点击导出按钮将Android studio中的hprof文件导出到自己的文件夹,用于后续在MAT工具中分析。
导出的hprof文件是无法直接在MAT工具中分析的,如果直接在MAT中打开这个文件会报错,需要进行转换,转换工具是sdk/platform-tools里面的hprof-conv.exe工具,执行命令进行转换:
在MAT中打开转换后的文件,打开后选择Histogram视图,输入SecondActivity进行过滤,可以看到SecondActivity对象有2个,右键选择SecondActivity对象,选择merge shortest paths to gc roots -> exclude all phantom/weak/soft etc. references,排除掉虚引用/弱引用/软引用,只保留强引用,因为只有强引用才会导致内存泄露。
分析强引用的引用链: