OOM,内存泄漏检测工具(LeakCanary)

千里之堤,毁于蚁穴qiān lǐ zhī dī,huǐ yú yǐ xué。释义:一个小小的蚂蚁洞,可以使千里长堤毁于一旦。
比喻小事不注意会造成大乱子。出处:《韩非子·喻老》====摘自百度百科点击打开链接


=====================以下内容如有错误,麻烦提出。共同进步=============================


内存溢出和内存泄漏的区别
内存溢出:程序在运行过程中造成应用进程使用的内存超过上限
内存泄漏:当某些对象在,使用完改释放的时候,但是其他对象持有这个对象的引用,则造成了无法释放,这个时候,我们就说这个对象造成内存泄漏。


oom 内存溢出并不只是在大图片或者图片加载不做软缓存的时候造成的问题。更深层次的问题就是,内存泄漏,该释放的没有释放


一个Activity中引用的viewview中引用的资源和bitamp,在activity销毁的时候,与之想关联的资源都会被释放
但是如果其他线程正在运行并且持有这个Activity的引用,则会造成activity不会被释放,这时候就造成内存泄漏,如果多次再打开此页面,很容易造成oom


如果A对象持有B对象的引用,当GC应当回收B的时候,发现A持有引用,则不会回收B对象。此时B就造成了内存泄漏


LeakCanary是开源组织Square发布的一个检测内存泄漏工具,在此致谢





以下介绍LeakCanary在AndroidStudio中的使用


1、在Module:App的grable中配置如下
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'




2、在项目的Application的onCreate配置如下
LeakCanary.install(this);



现在LeakCanary就会检测所有的Activity的内存泄漏的情况


3、检测其他类的对象内存泄漏情况
RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
refWatcher.watch(someObjNeedGced);





此时如果软件出现内存泄漏,LeakCanary会以友好的提醒你如下图
OOM,内存泄漏检测工具(LeakCanary)
文章图片


【OOM,内存泄漏检测工具(LeakCanary)】

界面非常明了的告诉你,是那个对象造成的内存泄漏。以此来做代码修改。




本人也一枚小白,有什么不对请多指教


附上一个大神对LeakCanary的分析http://www.jianshu.com/p/0049e9b344b0






    推荐阅读