自己在Android开发中也会时常遇到OOM的问题,但是在此之前,我对他的处理没有台看重,因为我还是个新手,没有开发过完整的APP项目,今天记录自己在网上看到的大牛整理出来对Android和java的内存泄露处理方法,也是希望自己在以后的开发道路上能够很好避免此类问题。
现在处理OOM常用的工具便是 LeakCanary。
先介绍一下LeakCanary在Android Studio中的使用方法:
1)在 build.gradle 中加入一下依赖:分为debug和release两个引用方式
dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' }2)使用RefWatcher
监控那些本该被回收的对象,具体使用如下:1.在application中,
public class ExampleApplication extends Application { public static RefWatcher getRefWatcher(Context context) { ExampleApplication application = (ExampleApplication) context.getApplicationContext(); return application.refWatcher; } PRivate RefWatcher refWatcher; @Override public void onCreate() { super.onCreate(); refWatcher = LeakCanary.install(this); }}其中LeakCanary.install()
会返回一个预定义的RefWatcher
,同时也会启用一个ActivityRefWatcher
,用于自动监控调用Activity.onDestroy()
之后泄露的 activity。2.监控Activity或者Fragment
public abstract class BaseFragment(Activity) extends Fragment( Activity){ @Override public void onDestroy() { super.onDestroy(); RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity()); refWatcher.watch(this); }}工作机制:
RefWatcher.watch()
创建一个 KeyedWeakReference 到要被监控的对象。然后在后台线程检查引用是否被清除,如果没有,调用GC。
如果引用还是未被清除,把 heap 内存 dump 到 APP 对应的文件系统中的一个
.hprof
文件中。在另外一个进程中的
HeapAnalyzerService
有一个HeapAnalyzer
使用HAHA 解析这个文件。得益于唯一的 reference key,
HeapAnalyzer
找到KeyedWeakReference
,定位内存泄露。
HeapAnalyzer
计算 到 GC roots 的最短强引用路径,并确定是否是泄露。如果是的话,建立导致泄露的引用链。引用链传递到 APP 进程中的
DisplayLeakService
, 并以通知的形式展示出来。链接:
这里是我学习的网址:https://www.liaohuqiu.net/cn/posts/leak-canary-read-me/,如果需要了解更多可以去看一下!
一个非常简单的 LeakCanary demo: https://github.com/liaohuqiu/leakcanary-demo
新闻热点
疑难解答