内存泄露大家应该不会陌生了,通常是因为该被释放的对象被占用,不能及时对其释放,导致GC无法正常回收。我们可以使用一些工具来监控和分析导致内存泄露的位置和原因。用Eclipse的同志应该都知道MAT(Memory Analysis Tools),Android Studio当然也不甘示弱,也有其强大的Android Monitor。
Android Monitor是Android Studio自带的一个强大的性能分析工具,里面一共包含5个模块:Logcat、Memory、CPU、Network、GPU
本文将针对Memory Monitor内存分析工具做简单的讲解
使用步骤
1,捕获hprof文件
首先点击initiate GC,手动调去GC。接下来点击Dump Java Heap,稍等片刻,正在生成hprof文件,该文件存放在项目里面的captures文件夹,每Dump一次将会获取一个hprof文件,该文件可以直接使用Android Studio打开进行分析。
2,执行分析hprof
当hprof文件捕获成功,as会自动打开我们捕获到的这个文件,界面如下:
接下来点击右上角的analyzer tasks将其展开,在点击绿色按钮perform analysis,会执行分析hprof文件
3,追踪占用
点开leaked Activities选项卡,这里面就是你的Activity内存泄露,选中其中一个Activity内存泄露,Reference Tree(图中左上角)会展示对应的对象占用的位置。
上图可以看到StaffManageActivity内存泄露,在Reference Tree里面看到是因为TestSingleton类的mContext占用,再往下看,instance才是罪魁祸首。这是单例模式造成的内存泄露
4,线程以及该线程的方法使用内存情况 (Allocaton Tracking)
点击Start Allocaton Tracking(即上图Allocaton Tracking)开始追踪,再次点击Allocaton Tracking结束追踪,这个时候会.alloc的文件并且会自动打开(这个过程可能需要等待一会儿,不要着急)
我们可以看到这个界面,我是使用Volley请求网络了,可以在Thread 17线程里面查看到各种方法所占用的内存大小以及百分比
5,Enabled按钮可以关闭和打开内存监控
内存抖动
1.介绍:内存抖动是因为大量的对象被创建又在短时间内马上被释放,瞬间产生大量的对象会严重占用YoungGeneration的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC。即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。简单的说,也就是可能会造成界面卡顿现象。
2.方法:如果你在Memory Monitor里面查看到短时间发生了多次内存的涨跌,这意味着很有可能发生了内存抖动。如下图
我这里的内存抖动是拼接字符串造成的内存抖动