说实话,可能由于自己的水平不够,老师讲的有些东西自己并没有听懂,而且最近相当忙,又要写这些笔记,所以有些东西描述不清楚请大家原谅。
在学习之前,先说一下垃圾回收这一概念吧,自己首次是在Java中听说过的,但是由于java虚拟机自带垃圾回收机制,所以就没有太多关注。但是学习C和C++在做一些复杂程序的时候想必肯定熟悉,因为C和C++是要自己人为释放内存的。
Android Studio提供了三种工具帮助进行内存优化:
- Memory Monitor
Memory Monitor工具为监控工具,是一种发现型或者说监控性质的工具。
在android studio的底部控制台可以找到。然后点击Monitors 我们可以看到一个坐标轴,横坐标记录从采集开始点到目前已经过去的时间,纵坐标是分配给App使用的内存总量,蓝色区域表示已分配使用的的,灰色区域表示空闲未使用的。在坐标轴的右边可以看见具体数值。
GC是垃圾回收的意思,我们可以从Memory monitor看到何时发生了GC event,当一个内存短时间内发生掉落,我们可以认为发生了GC操作。你也可以手动触发GC,下图中的小车子就是触发GC的按钮,一旦按下就会回收那些没被引用的对象。 - AllocationTracker
同样,我们也可以在相同位置的旁边找到 AllocationTracker,它也可以帮助我们监视程序的运行,点击开始后,运行相关的android程序操作,然后完成操作后再次点击结束检测,这样我们就得到这一段时间内程序的运行状态的数据。面板左上角是所有历史数据文件列表,后面是详细信息。而且会有两个查看方式的选项:
- Group by Method:用方法来分类我们的内存分配
- Group by Allocator:用内存分配器来分类我们的内存分配
不同的选项,显示的信息会不同;
除此之外,还有一个比较酷的就是统计按钮;可以帮助我们统计相关数据;
HeapDump和LeakCanary
HeapDump得到的数据可以帮助我们检查是否发生内存泄漏,点击dump java heap 这个按钮,然后Android Studio就开始干活了,然后我们可以观察对象的创建的个数和占用大小来发现是否发生泄漏。但是这种方法很不方面,所以我们可以借助LeakCanary插件;
LeakCanary会检测应用的内存回收情况,如果发现有垃圾对象没有被回收,就会去分析当前的内存快照,找到对象的引用链,并显示在页面上。这款插件的好处就是,可以在手机端直接查看内存泄露的地方,可以辅助我们检测内存泄露;
LeakCanary使用:
在build.gradle文件中添加
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
在应用的Application onCreate方法中添加LeakCanary.install(this),如下:
@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
这样我们就完成了,当发生内存泄露时,会有提示:
很方便!