内存泄漏分析之-内存分析工具的使用

来源:互联网 发布:绝地求生多线程优化 编辑:程序博客网 时间:2024/06/05 18:17

知道了内存泄漏的种种原因后,我们想知道程序是否发生了内存泄露,并定位到内存泄露的具体位置应该怎么做呢?

1.查看GC日志判断是否发生内存泄露

程序每进行一次GC操作,Logcat中就会输出一次GC日志。日志格式如下:
<GC_name>: <GC_Reason> <Amount_freed>, <Heap_stats>, <Pause_time>

  • GC_name :运行环境,android4.4之前程序运行在dalvik虚拟机上,GC_name就为D/dalvik;android4.4之后加入了art运行环境,GC_name就我I/art.
  • GC_Reason : 出发GC操作的原因。
  • Amount_freed :系统通过这次GC释放的内存
  • Heap_stats : 当前内存的空闲比例以及使用情况(活动对象所占内存 / 当前程序总内存)
  • Pause_time : GC操作导致应用程序暂停的时间。

鉴于运行环境的不同,android4.4之前使用dalvik运行环境时一次GC日志如下:
这里写图片描述

android4.4后art运行环境发生一次GC时日志如下:
这里写图片描述

通过查看GC日志,可以简单的了解当前GC的情况,如果反复进入某个界面很快就出现GC_Reason = GC_CONCURRENT ,那么就要小心了,这个页面可能出现了内存泄漏。

2. 内存分析工具-MAT

通过GC日志大概可以判断程序是否发生了内存泄露,要想找出内存泄露的具体原因及准确位置,就需要用到内存分析工具了。
MAT工具能够对AndroidStudio中Monitors下的memory工具产生的hprof文件进行分析整理,通过追踪,最终可以找到具体的内存泄露的地方,至于怎么用,这里就不多说了。

3. 内存分析工具-LeakCanary

LeakCanary相比MAT不同的地方在于LeakCanary可以将内存泄露的情况输出到手机屏幕上,更加直观。

好了,本节简单的介绍了内存泄露的分析工具,需要注意的是,虽然分析工具五花八门,但机制都大同小异,这些分析工具也没法保证一定可以将程序中的泄露原因都找出来,关键还是需要自己在写代码的时候多加注意,避免可能出现内存泄露的代码出现。