LeakCanary内存泄漏检测框架分析。

这篇具有很好参考价值的文章主要介绍了LeakCanary内存泄漏检测框架分析。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么叫内存泄漏、内存溢出?

内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个10M的Bitmap,但系统分配给APP的连续内存不足10M,就会导致内存溢出。

内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory!

二、LeakCanary使用:

1、增加依赖: 

LeakCanary内存泄漏检测框架分析。,android,java,android,LeakCanary

2、LeakCanary核心思想:

1)找出有泄漏嫌疑的对象;

2)确诊 -- 使用可达性分析;

3、LeakCanary启动流程:

1)在LeakCanary源码的mainfest.xml文件里面注册了contentprovide;

2)APP在打包时会合并所有引用的三方库的mainfest.xml文件到APP的mainfest.xml文件;

3)在APP启动时,程序会加载LeakCanary注册的contentprovide,并执行contentprovide的onCreate方法;

4)在contentprovide的onCreate方法里面做初始化工作;

LeakCanary内存泄漏检测框架分析。,android,java,android,LeakCanary

5)通过ActivityLifecycleCallbacks监听activity/Fragment生命周期,自动调用RefWatcher.watch(Object obj)进行内存泄漏检测;

LeakCanary内存泄漏检测框架分析。,android,java,android,LeakCanary

6)如果要检测Object对象,则要手动调用RefWatcher.watch(Object obj)方法;

7)启动一个工作线程用于内存泄漏检测。

LeakCanary内存泄漏检测框架分析。,android,java,android,LeakCanary

各生命周期的自动监听:

Activity的生命周期监听:注册 Application.ActivityLifecycleCallbacks ;

Fragment的生命周期期监听:同样,注册 FragmentManager.FragmentLifecycleCallbacks,但Fragment较为复杂,因为Fragment有三种,即android.app.Fragment、androidx.fragment.app.Fragment、android.support.v4.app.Fragment,因此需要注册各自包下的FragmentManager.FragmentLifecycleCallbacks;

ViewModel的监听:由于ViewModel也是androidx下面的特性,因此其依赖androidx.fragment.app.Fragment的监听;

三、RefWatcher.watch()如何检测是否存在内存泄漏?

1、Java的四种引用

1. 强引用(Strong Reference)
如果一个对象具有强引用,则无论在什么情况下,GC都不会回收被引用的对象。当内存空间不足时,JAVA虚拟机宁可抛出OutOfMemoryError终止应用程序也不会回收具有强引用的对象。

2. 软引用(Soft Reference)
表示一个对象处在有用但非必须的状态。如果一个对象具有软引用,在内存空间充足时,GC就不会回收该对象;当内存空间不足时,GC会回收该对象的内存(回收发生在OutOfMemoryError之前)。

3. 弱引用(Weak Reference)
用来描述非必须的对象。它类似软引用,但是强度比软引用更弱一些:弱引用具有更短的生命.GC在扫描的过程中,一旦发现只具有被弱引用关联的对象,都会回收掉被弱引用关联的对象。换言之,无论当前内存是否紧缺,GC都将回收被弱引用关联的对象。

4. 虚引用(Phantom Reference)
虚引等同于没有引用,这意味着在任何时候都可能被GC回收,设置虚引用的目的是为了被虚引用关联的对象在被垃圾回收器回收时,能够收到一个系统通知。

2、ReferenceQueue

ReferenceQueue引用队列,存放引用的队列,保存Reference对象。其作用在于Reference对象所引用的对象被GC回收时,该Reference对象将会被加入引用队列中(ReferenceQueue)的队列末尾。

LeakCanary内存泄漏检测框架分析。,android,java,android,LeakCanary

3、GCRoots与可达性分析

通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所有的引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。

LeakCanary内存泄漏检测框架分析。,android,java,android,LeakCanary

4、RefWatcher.watch检测内存泄漏的逻辑

1.创建WeakReference对象(弱引用容器)引用object对象(被监控对象);

2.当触发GC回收操作时,如果object对象被回收,则会将WeakReference对象移到ReferenceQueue队列末尾;也就是说,当触发GC回收操作时,判断WeakReference对象是否移到ReferenceQueue队列,没有,则表示object对象没有被回收,object对象可能存在泄漏。

LeakCanary内存泄漏检测框架分析。,android,java,android,LeakCanary

四、总结 

1)LeakCanary是通过在Application的registerActivityLifecycleCallbacks方法实现对Activity销毁监听的,该方法主要用来统一管理所有activity的生命周期。所有Activity在销毁时在其OnDestory方法中都会回调ActivityLifecycleCallbacks#onActivityDestroyed方法,而LeakCanary要做的就是在该方法中调用RefWatcher#watch方法实现对activity进行内存泄漏监控。

2)LeakCanary利用了Java的引用与垃圾回收机制,即WeakReference和ReferenceQueue,通过将Activity包装到WeakReference中,被WeakReference包装过的Activity对象如果能够被回收,则说明引用可达,垃圾回收器就会将该WeakReference引用存放到ReferenceQueue中。假如我们要监视某个activity对象,LeakCanary就会去ReferenceQueue找这个对象的引用,如果找到了,说明该对象是引用可达的,能被GC回收,如果没有找到,说明该对象有可能发生了内存泄漏。

3)LeakCanary会将Java堆转储到一个.hprof文件中,再使用自己实现的hprof解析器分析.hprof文件并定位堆转储中“滞留”的对象,并对每个"滞留"的对象找出 GC roots 的最短强引用路径,并确定是否是泄露,如果泄漏,建立导致泄露的引用链。最后,再将分析完毕的结果以通知的形式展现出来。 文章来源地址https://www.toymoban.com/news/detail-614456.html

到了这里,关于LeakCanary内存泄漏检测框架分析。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Android】一个contentResolver引起的内存泄漏问题分析

    长时间的压力测试后,系统发生了重启,报错log如下 JNI ERROR (app bug): global reference table overflow (max=51200) global reference table overflow的log 08-08 04:11:53.052912   973  3243 F zygote64: indirect_reference_table.cc:256] JNI ERROR (app bug): global reference table overflow (max=51200) 08-08 04:11:53.053014   973  3243 F z

    2024年02月08日
    浏览(9)
  • Android性能优化之修复游戏中内存泄漏(java层)

    Android性能优化之修复游戏中内存泄漏(java层)

    游戏在bugly上内存OOM越来越严重,因此,近期对内存进行优化。从java层的内存进行优化开始,通过LeakCannary或者adb shell 获取到内存快照,发现好几处内存泄漏点。 1.单例类持有Activity : 查看内存快照,该闪屏页面Activity(包含引用对象)可回收3.8M的内存; LeakCannary的内存分析也

    2024年02月15日
    浏览(17)
  • Java中关于内存泄漏分析和解决方案,都在这里了!

    Java中关于内存泄漏分析和解决方案,都在这里了!

    最近正在熟悉Java内存泄漏的相关知识,上网查阅了一些资料,在此做个整理算是对收获的一些总结,希望能对各位有所帮助,有问题可以文末留言探讨、补充。 如下是整篇文章的结构,所需阅读时间大约20min 内存泄漏 :对象已经没有被应用程序使用,但是垃圾回收器没办法

    2024年02月13日
    浏览(6)
  • 内存泄漏检测方式

    内存泄漏检测方式

    一 、 日志记录         通过宏定义重载了 malloc 和 free 函数,以在分配和释放内存的时候记录一些信息,包括文件名和行号,并将这些信息写入到相应的文件中。然后在 main 函数中演示了使用这些宏进行内存分配和释放。 _malloc 函数: 在分配内存之后,创建一个文件名,

    2024年01月17日
    浏览(9)
  • C++内存泄漏检测工具

    C++内存泄漏检测工具

    在程序中增加相应的内存检测工具  #define CRTDBG MAP ALLOC #include stdlib.h #include crtdbg.h #ifdef DEBUG #ifndef DBGNEW #define DBG_NEW new (_NORMAL_BLOCK,_FILE_LINE_) #define new DBG NEW #endif #endif _CrtDumpMemoryLeaks(); 当没有释放内存时候: 增加了delete时候:  

    2024年01月25日
    浏览(9)
  • 项目性能优化-内存泄漏检测与修改

    项目性能优化-内存泄漏检测与修改

    最近终于有空优化一波项目的性能了,第一波借助Android Studio自带的Profiler工具检测内存泄漏。 右侧带有绿色原点的就是此时运行的Profiler的SESSION,点击右侧MEMORY进入内存监控的详情模块 第三步中抓取一段时间后,会自动停止,并打开Heap Dump文件 可以看到抓取到2个会导致内存

    2024年02月11日
    浏览(11)
  • Python中的内存泄漏及其检测方法

    一、引言 内存泄漏是编程中常见的问题之一,它会导致程序在运行过程中不断消耗内存,最终可能导致程序崩溃或性能下降。在Python中,内存泄漏也是一个需要关注的问题。本文将详细介绍Python中的内存泄漏及其检测方法,以帮助读者更好地理解和解决这个问题。 二、Pyth

    2024年02月22日
    浏览(9)
  • iOS 内存泄漏检测 Instruments Leaks

    iOS 内存泄漏检测 Instruments Leaks

    Xcode 中 按住 command + I 或者菜单栏 Product – Profile 2. 双击 Leaks 或者按 choose,打开 Leaks 面板 3. 在显示的 Leaks 面板中,点击左上角红色点,即可运行内存检测。 4. 在运行过程中如果发现Leak Checks(如图)出现红色X说明检测到内存泄露,将鼠标点击Leak Checks,在下方即可看到内存

    2024年02月01日
    浏览(9)
  • 手写C语言的内存泄漏检测组件

    CC++语言中,栈空间有大小限制,所以程序员可以使用堆空间的内存。堆空间的内存是程序员自己申请的,需要程序员自己去调用释放的操作。内存管理是CC++程序员必须要注意的问题,其中包括了内存泄漏,内存泄漏的原因是程序中申请的内存没有进行释放,来看下面的例子

    2024年02月03日
    浏览(7)
  • Android之内存泄漏与内存溢出

    Android之内存泄漏与内存溢出

    内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存

    2024年02月13日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包