百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Android Studio 内存泄漏分析指南

suiw9 2024-11-05 12:34 19 浏览 0 评论

最近在优化公司的项目,想针对内存泄漏进行分析一下,查阅网上的一些资料,发现苦逼的是,资料一大堆,但是内容都差不多,至今未找到一篇实战的内存泄漏分析,全部停留在理论知识上,最后查阅了一些外文文献,才有了一点思路,好吧!既然没有实战分析,我就做第一人,把我学到的分享出来,希望对你们有帮助,当然有说的不对的,望各位指出来~

内存泄漏原因

当应用不需要某对象时候,忘记释放分配的内存,该对象仍然保持被引用状态(当对象拥有强引用,GC无法回收),从而导致内存泄漏

泄漏的源头

泄漏的源头有很多,有开源的第三方框架引起的、android系统自身造成的如webview的内存泄漏,还有一个是我们可以控制的就是自身编码引起的内存泄漏,这也是我们可以避免的,一下情况容易出现内存泄漏

一、 Context 引起的内存泄漏

常见问题:

这个是最常见的,因为Activity经常要用到上下文Context,很有可能Activity作为Context传递给某些类,Activity生命周期结束之后,某些类仍然存活并保持着该Activity的引用,保持引用就无法被回收。从而导致内存泄漏

解决方案:

  1. 下次如果要传入context给某些类的时候,最好是用ApplicationContext,这样可以有效避免内存泄漏

  2. 在界面销毁的时候,手动释放掉引用过activity的context

二、Static 静态变量

常见问题:

我们有时候会为了方便,设置某个Activity或者View为静态变量,但是你要知道,static变量是要贯穿整个应该的生命周期,就是意味着即使Activity销毁,static变量也不会销毁,所以,如果你把View或者Activity设置为静态变量,这会导致当前的Activity会一直存在,从而导致内存泄漏

解决方案:

  1. 尽量避免使用static变量

  2. 如果非要使用的话,记得在界面销毁的时候,把静态变量也释放掉,简单说就是把静态变量置空,如staticView=null

三、非静态内部类、匿名内部类持有外部类的引用

常见问题:

我们在使用AsyncTash、Handler、TimerTask、Thread的时候,为了方便,直接new一个匿名内部类对象,殊不知我们在new一个的时候,编译器在编译的时候会自动为内部类的构造方法加上外包类的引用,所以这些匿名内部类会持有Activity,当这些匿名内部类处理非常耗时的操作时候,就算Activity生命周期结束,也不会被销毁,这就会造成内存泄漏

解决方案:

  1. 当Activity销毁的时候,对不需要的匿名内部类进行任务停止操作

  2. 使用静态内部类,静态内部类内部使用弱引用来引外外部类,这样当Activity销毁的时候,弱引用是可以被回收的

四、其他引起的泄漏

  1. 我们在使用系统服务的时候,比如注册了一些广播监听,在使用完后,要释放掉

  2. 我们在给View绘制动画的时候,View被动画持有,而Activity又被View持有引用,导致Activity也无法释放。所以在Activity销毁时,调用animator.cancel()来停止动画

内存泄漏分析-实战篇

这个才是尽头的重头戏,前面写的只是对网上文献的一些总结

分析工具

  1. MAT :eclipse时代的分析工具,具体分析实战可以参考这篇文章

  2. LeakCanary: Square开源的内存泄漏探测器,具体使用参考这篇文章

  3. Android Monitor:Android Studio 自带的分析工具,今天的重头戏

Android Monitor

  1. 生成HPROF文件,点击红框中有绿色下载箭头的按钮(Dump java Heap),这个会生成以hprof结尾的文

  2. 生成的效果如下图,简单介绍一下界面功能

功能描述:

名称描述
Total Count该类的实例总数
Heap Count所选择的堆中该类的实例的数量
Sizeof单个实例所占空间大小(如果每个实例所占空间大小不一样则显示0)
Shallow Size堆里所有实例大小总和(Heap Count * Sizeof)
Retained Size该类所有实例所支配的内存大小
Instance具体的实例
Reference Tree所选实例的引用,以及指向该引用的引用。
DepthGC根节点到所选实例的最短路径的深度
Shallow Size所选实例的大小
Dominating Size所选实例所支配的内存大小

3. 也许你看完这些也还是一头雾水,不知道怎么分析,没关系,我们不就是要找到内存泄漏的源头嘛,来看这里,要开始放大招啦,看到上图中最右边的 Analyzer Tasks,点击这个版块,这个版块就是主要的查找内存泄漏版块

4. 启动页很简单,点击绿色运行按钮就好,之后会在下面列出可能存在内存泄漏的Activity,如果没显示,说明启动的Activity中没有内存泄漏

5. 查看引用树(Reference Tree),都是根据这个查找内存泄漏的具体地方的

6. 一般有类似三角形的,就是一直被引用这,导致内存泄漏,找到对应的地方也很简单,右键项目点击Jump to Source就会打开对应泄漏源码的地方啦,然后我们在根据上面说的泄漏原因,及解决办法修正就好啦

上面一共有五六处内存泄漏,都是我故意写出来的,目的就是为了练习排查分析内存泄漏,特地放上源码,demo中内存泄漏以及修复代码都有,欢迎下载学习,如果觉得不错,顺手给个star

下载地址:MemoryLeakSamples

相关推荐

5款Syslog集中系统日志常用工具对比推荐

一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...

跨平台、多数据库支持的开源数据库管理工具——DBeaver

简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...

强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)

NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...

3 年 Java 程序员还玩不转 MongoDB,网友:失望

一、什么场景使用MongoDB?...

拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南

作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...

mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?

前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...

solidworks使用心得,纯干货!建议大家收藏

SolidWorks常见问题...

统一规约-关乎数字化的真正实现(规范统一性)

尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...

Elasticsearch节点角色配置详解(Node)

本篇文章将介绍如下内容:节点角色简介...

产前母婴用品分享 篇一:我的母婴购物清单及单品推荐

作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...

比任何人都光彩照人的假期!水润、紧致的肌肤护理程序

图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...

Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型

中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...

柔性——面向大规模定制生产的数字化实现的基本特征

大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...

创建PLC内部标准——企业前进的道路

作者:FrankBurger...

标准化编程之 ----------- 西门子LPMLV30测试总结

PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...

取消回复欢迎 发表评论: