垃圾回收包含两个过程:
判定阶段主要有两种方式
1 一些虚拟机栈中的对象;2 方法区中的类静态属性对象;3 方法区中的常量对象;4 Native栈中JNI的引用对象
收集阶段主要有四种方式
Android5.0 之前使用Dalvik虚拟机,之后使用ART虚拟机,下面是一些比较:
Allocation Tracking是DDMS中提供内存工具,用来显示一段时间内的内存分配情况。
选择要跟踪的进程名,点击Start Tracking开始跟踪,做一些操作后点击Get Allocations就可以将这段操作中新分配的对象显示出来,点击具体的对象可以在下面看到是哪一个方法分配的这个对象。
Heap Tool可以查看当前的内存快照
从数据里可以看到当前内存的占用和回收情况,每次垃圾回收这里的数据都会更新,因为会不断获取内存数据刷新显示,所以这时候对应用操作会出现卡顿。
Heap Tool提供的是一个内存的总体情况,图表显示的内容比较简单,如果要具体分析的话最好生成.hprof文件,使用MAT工具进行分析。
关于MAT工具的使用已经有很多介绍,google官方曾经写过一个使用介绍http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html,推荐一个中文博客,
http://blog.csdn.net/guolin_blog/article/details/42238633,写的很好。
一般用到MAT工具分析内存都是因为发生了应用发生了内存泄漏,需要自己去分析可能泄漏的地方,然后用MAT工具去验证。而最近Square公司开源了一个内存泄漏检测项目LeakCanary,极大地简化了这个过程,可以说是Android内存泄漏检测的终极利器。
A memory leak detection library for Android and Java.
项目地址:https://github.com/square/leakcanary
LeakCanary会检测应用的内存回收情况,如果发现有垃圾对象没有被回收,就会去分析当前的内存快照,也就是上边MAT用到的.hprof文件,找到对象的引用链,并显示在页面上。
使用:
在build.gradle文件中添加
dependencies {
debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.3‘
releaseCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.3‘
}
在应用的Application onCreate方法中添加LeakCanary.install(this)
,如下
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
应用运行起来后,LeakCanary会自动去分析当前的内存状态,如果检测到泄漏会发送到通知栏,点击通知栏就可以跳转到具体的泄漏分析页面。
关于LeakCanary的更多分析可以看项目主页的介绍,还有这里http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
http://sr1.me/way-to-explore/2014/06/20/what-is-art-to-android.html
http://www.infoq.com/cn/news/2014/07/art-runtime
http://android.jobbole.com/80926/
http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
原文地址:http://blog.csdn.net/xu_fu/article/details/45678373