当前位置:首页 > 数码 > Android内存泄漏检测利器-入门LeakCanary (android是什么)

Android内存泄漏检测利器-入门LeakCanary (android是什么)

admin6个月前 (05-11)数码29

在Java中,有四种不同的引用类型,分别是:

  • 强引用(StrongReference)
  • 软引用(SoftReference)
  • 弱引用(WeakReference)
  • 虚引用(PhantomReference)

强引用

强引用是指JVM会一直跟踪和维护该对象。只要强引用存在,即使内存不足,JVM也不会回收该对象。


Object obj = new Object();
  

软引用

软引用是指JVM会跟踪该对象,但在内存不足时可能会被回收。软引用常用于缓存,当内存紧张时,可以释放缓存对象以释放内存。


SoftReference<Object> softRef = new SoftReference<>(new Object());
  

弱引用

弱引用是指JVM不会跟踪该对象,当发现对象只有弱引用时,JVM就会回收它。弱引用常用于事件监听器或回调函数,当对象不再需要时,JVM会自动回收它。


WeakReference<Object> weakRef = new WeakReference<>(new Object());
  
android是什么

虚引用

虚引用是指JVM不会跟踪该对象,只是维护一个指向该对象的队列。当JVM准备回收该对象时,会将该虚引用添加到队列中。虚引用常用于清理工作,当对象被回收时,可以执行一些额外的清理操作。


ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
  

简介

LeakCanary是一个用于检测Android应用内存泄漏的开源库。它可以帮助开发者在应用运行过程中及时发现和解决内存泄漏问题,提高应用的稳定性和性能。

使用场景

LeakCanary可以广泛应用于以下场景:

  • 检测和解决内存泄漏问题
  • 提高应用的性能和稳定性
  • 优化内存管理

使用方式

使用LeakCanary非常简单,只需要在应用的 build.gradle 文件中添加依赖,并在 Application 类中进行初始化即可。


dependencies {
    debugImplementation "com.squareup.leakcanary:leakcanary-android:2.12"
    releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:2.12"
}

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        if (LeakCanary.isInAnalyzerProcess(this)) {
            return;
        }
        LeakCanary.install(this);
    }
}
  

工作原理

LeakCanary通过监测应用中的对象引用关系,当一个对象被创建后,LeakCanary会跟踪其引用链,如果发现该对象没有被正确释放,就会触发内存泄漏的检测和报告。

LeakCanary的工作流程如下:

  1. 监控对象引用关系
  2. 分析对象引用链
  3. 检测内存泄漏
  4. 报告内存泄漏

LeakCanary会生成一个详细的内存泄漏报告,包括泄漏对象的引用链和相关的上下文信息,帮助开发者快速定位和修复内存泄漏问题。

结论

LeakCanary是一个强大的工具,可以帮助开发者及时发现和解决Android应用中的内存泄漏问题。这有助于提高应用的性能和稳定性,使应用运行更加流畅和可靠。


Android 开发人员帮忙看一下这个是什么软件.

LeakCanary square出的检测内存泄漏的工具。 精品!中文使用说明:源码github地址:

Android开发中,有哪些好方法可以检测内存泄露和性能?

下面是回答的内容

内存泄露,是Android开发者最头疼的事。可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴。怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的Android Studio 检测内存非常方便, 如果结合上MAT工具,LeakCanary插件,一切就变得so easy了。

熟悉Android Studio界面工欲善其事,必先利其器。

我们接下来先来熟悉下Android Studio的界面

一般分析内存泄露, 首先运行程序,打开日志控制台,有一个标签Memory ,我们可以在这个界面分析当前程序使用的内存情况, 一目了然, 我们再也不需要苦苦的在logcat中寻找内存的日志了。

图中蓝色区域,就是程序使用的内存, 灰色区域就是空闲内存,

当然,Android内存分配机制是对每个应用程序逐步增加, 比如你程序当前使用30M内存, 系统可能会给你分配40M, 当前就有10M空闲, 如果程序使用了50M了,系统会紧接着给当前程序增加一部分,比如达到了80M, 当前你的空闲内存就是30M了。 当然,系统如果不能再给你分配额外的内存,程序自然就会OOM(内存溢出)了。 每个应用程序最高可以申请的内存和手机密切相关,比如我当前使用的华为Mate7,极限大概是200M,算比较高的了, 一般128M 就是极限了, 甚至有的手机只有可怜的16M或者32M,这样的手机相对于内存溢出的概率非常大了。

我们怎么检测内存泄露呢

首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中。一般情况下,高密度的手机,一个页面大概就会消耗20M内存,如果发现退出界面,程序内存迟迟不降低的话,可能就发生了严重的内存泄露。我们可以反复进入该界面,然后点击dump java heap 这个按钮,然后Android Studio就开始干活了,下面的图就是正在dump

dump成功后会自动打开 hprof文件,文件以Snapshot+时间来命名

通过Android Studio自带的界面,查看内存泄露还不是很智能,我们可以借助第三方工具,常见的工具就是MAT了,这里我们需要下载独立版的MAT. 下图是MAT一开始打开的界面, 这里需要提醒大家的是,MAT并不会准确地告诉我们哪里发生了内存泄漏,而是会提供一大堆的数据和线索,我们需要自己去分析这些数据来去判断到底是不是真的发生了内存泄漏。

接下来我们需要用MAT打开内存分析的文件, 上文给大家介绍了使用Android Studio生成了 hprof文件, 这个文件在呢, 在Android Studio中的Captrues这个目录中,可以找到

注意,这个文件不能直接交给MAT, MAT是不识别的, 我们需要右键点击这个文件,转换成MAT识别的。

然后用MAT打开导出的hprof(File->Open heap dump) MAT会帮我们分析内存泄露的原因

自动分析内存泄露

LeakCanary

上面介绍了MAT检测内存泄露, 再给大家介绍LeakCanary。可以去github上搜会检测应用的内存回收情况,如果发现有废品对象没有被回收,就会去分析当前的内存快照,也就是上边MAT用到的文件,找到对象的引用链,并显示在页面上。这款插件的好处就是,可以在手机端直接查看内存泄露的地方,可以辅助我们检测内存泄露.

使用:在文件中添加,不同的编译使用不同的引用:

在应用的Application onCreate方法中添加(this),如下:

应用运行起来后,LeakCanary会自动去分析当前的内存状态,如果检测到泄漏会发送到通知栏,点击通知栏就可以跳转到具体的泄漏分析页面。Tips:就目前使用的结果来看,绝大部分泄漏是由于使用单例模式hold住了Activity的引用,比如传入了context或者将Activity作为listener设置了进去,所以在使用单例模式的时候要特别注意,还有在Activity生命周期结束的时候将一些自定义监听器的Activity引用置空。

追踪内存分配

如果我们想了解内存分配更详细的情况,可以使用Allocation Traker来查看内存到底被什么占用了。用法很简单:

点击追踪内存分配

点一下是追踪, 再点一下是停止追踪, 停止追踪后 文件会自动打开,打开后界面如下:

当你想查看某个方法的源码时,右键选择的方法,点击Jump to source就可以了

查询方法执行的时间

Android Studio 功能越来越强大了, 我们可以借助AS观测各种性能,如下图:

Android studio2.1 界面发生了变化,功能没有太大区别:

如果我们要观测方法执行的时间,就需要来到CPU界面

点击Start Method Tracking, 一段时间后再点击一次, trace文件被自动打开,

结果

非独占时间:某函数占用的CPU时间,包含内部调用其它函数的CPU时间。独占时间:某函数占用CPU时间,但不含内部调用其它函数所占用的CPU时间。

我们如何判断可能有问题的方法?

通过方法的调用次数和独占时间来查看,通常判断方法是:

如果方法调用次数不多,但每次调用却需要花费很长的时间的函数,可能会有问题。

如果自身占用时间不长,但调用却非常频繁的函数也可能会有问题。

综述

上面给大家介绍了若干使用Android Studio检查程序性能的工具,工具永远是辅助,不要因为工具耽误太长时间。如果有问题,欢迎大家纠正。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Android

“Android内存泄漏检测利器-入门LeakCanary (android是什么)” 的相关文章

搜索引擎可以轻松找到和索引您的页面-可抓取性和可索引性 (搜索引擎可以分为哪些类型)

搜索引擎可以轻松找到和索引您的页面-可抓取性和可索引性 (搜索引擎可以分为哪些类型)

AndroidEmulator 是一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序。但是,该程序本身不是很稳定,很容易出现黑屏、启动不了、崩溃等问题。 解决方法 1. 检查软件...

在Android运行开发中应用NFC配置 (在android中使用menu时可能需要重写的方法有)

在Android运行开发中应用NFC配置 (在android中使用menu时可能需要重写的方法有)

NFC引见 NFC是指近场通讯(NearFieldCommunication),它是一种短距离无线通讯技术,准许设施在非接触或极短距离内启动通讯。NFC通罕用于移动支付、门禁系统、默认标签和...

Android数据对象序列化原理与运行 (android是什么)

Android数据对象序列化原理与运行 (android是什么)

序列化与反序列化 「序列化」是将对象转换为可以存储或传输的格局的环节。在计算机迷信中,对象通常是指内存中的数据结构,如数组、列表、字典等。经过序列化,可以将这些对象转换为字节流或文本格局,以...

结构和应用-深入了解Android中的SELinux-了解其功能 (茶多酚的结构和应用)

结构和应用-深入了解Android中的SELinux-了解其功能 (茶多酚的结构和应用)

SELinux 简介 SELinux(Security-Enhanced Linux)是一种安全增强的 Linux 操作系统,它通过强制访问控制 (MAC) 机制来提供更高级别的系统安全保护...

Context在Android开发中的至关重要性 (contextual)

Context在Android开发中的至关重要性 (contextual)

Introduction In Android development, Context is a crucial class that represents the curr...

从单一进程到模块化设计-Android-架构演进历程 (单进程系统)

从单一进程到模块化设计-Android-架构演进历程 (单进程系统)

Android architecture has undergone multiple evolutions, from the initial traditional MVC architect...

AIDL在Android运行程序开发中的关键性

AIDL在Android运行程序开发中的关键性

DL引见 AIDL(InterfaceDefinitionLanguage)是一种用于定义Android运行程序中的跨进程通讯接口的言语。经过经常使用AIDL,开发人员可以定义客户端和服务之...

深入了解-硬件抽象层的奥秘-揭开-HAL-Android-系统架构 (什么是硬知识)

深入了解-硬件抽象层的奥秘-揭开-HAL-Android-系统架构 (什么是硬知识)

Android系统中,硬件抽象层(HAL)扮演着至关重要的角色,它负责在不同硬件和上层应用程序之间建立一个抽象层。有了HAL,不同的硬件设备可以被统一调用,从而提高了系统的兼容性和可移植性。...