Android -- 每日一问:如何检测内存泄露,如何进行内存优化?

news2024/12/23 9:41:38

在这里插入图片描述

经典回答

Android 系统为每一个应用程序都设置了一个硬性的 Dalvik Heap Size 最大限制阈值,这个阈值在不同的设备上会因为 RAM 大小不同而各有差异。如果你的应用占用内存空间已经接近这个阈值,此时再尝试分配内存的话,很容易引起 OOM 。

在 Android Studio 上也可以通过 Memory Monitor 查看内存中 Dalvik Heap 的实时变化:
image.png
image.png

注意:GC 过于频繁容易出现内存抖动,这也是造成应用卡顿的常见原因。

也可以通过命行的方式查看:

adb shell dumpsys meminfo <package_name|pid> [-d]

具体的数值意义可以查看官网的说明:https://developer.android.com/studio/profile/investigate-ram.html

MAT 内存分析工具
详细的内存使用情况,可以通过 Android Studio 的 Android Monitor 界面,在 Memory 那栏有上几个小图标,点击有一个向下箭头的图标会自动生成并打开的 HPROF 视图。

不过用他来分析内存泄露还不是很智能,我们可以借助第三方工具,常见的工具就是 MAT 了(Memory Analyzer Tool),下载地址 http://eclipse.org/mat/downloads.php,这里我们需要下载独立版的 MAT(之前在使用Ecelipse开发Android应用时,我们常常会使用它的插件版本)。

注意:Android Monitor 生成的 HPROF 文件为 Dalvik 虚拟机格式的,需要转成 J2SE 虚拟机格式的,否则 MAT 工具中无法打开。转换的方式也很简单,Android Studio 自带了,直接在 “Captures”->“Heap Snapshot” 选中刚刚生成的".hprof" 文件,然后鼠标右键选择 “Export to standard .hprof” 可以在 MAT 上使用了。

MAT 的具体使用方式,网上很多,大家可以自己搜一下。这里就提一下用它怎么能快速查找到内存泄露的点,比如通过 “Dominator Tree”的"Path To GC Roots"的排除虚引用/弱引用/软引用等的引用链,因为被虚引用/弱引用/软引用的对象可以直接被GC给回收,我们要看的就是某个我们已经不需要使用的对象否还存在强引用链。比如,我们已退出一个Activity(onDestroy方法也被执行了),但在Path To GC Roots中却发现这个Activity对象还被有一个引用链,那么就可以确认这个Activity对像就产生了内存泄漏。一般来说,从它的引用链上也可以直观地看出是谁在引用它。

除了上面介绍了 MAT 检测内存泄露, 有一个叫LeakCanary工具大家也可以尝试一下。项目地址:https://github.com/square/leakcanaryLeakCanary会检测应用的内存回收情况,如果发现有垃圾对象没有被回收,就会去分析当前的内存快照,也就是上边 MAT 用到的 .hprof 文件,找到对象的引用链,并显示在页面上。这款插件的好处就是,可以在手机端直接查看内存泄露的地方,可以辅助我们检测内存泄露。

image.png

开发中如何避免内存泄漏

这点我比较喜欢问面试者,希望面试者能罗列出一些他自己遇到过的情况。通常来说,Activity 的泄漏是内存泄漏里面最严重的问题,它占用的内存多(它里面有N多资源的引用),影响比较明显。下面就示例两种错误的引用方式。

错误的单例模式

public class Singleton {
    private static Singleton instance;
    private Context mContext;

    private Singleton(Context context) {
        this.mContext = context;
    }

    public static Singleton getInstance(Context context) {
        if (instance == null) {
            instance = new Singleton(context);
        }
        return instance;
    }
}

这是一个非线程安全的单例模式,instance作为静态对象,其生命周期要长于普通的对象,其中也包含Activity,假如Activity A去getInstance获得instance对象,传入this,常驻内存的Singleton保存了你传入的Activity A对象,并一直持有,即使Activity被销毁掉,但因为它的引用还存在于一个Singleton中,就不可能被GC掉,这样就导致了内存泄漏。

View 持有 Activity 引用

public class MainActivity extends Activity {
    private static Drawable mDrawable;

    @Override
    protected void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_main);
        ImageView iv = new ImageView(this);
        mDrawable = getResources().getDrawable(R.drawable.ic_launcher);
        iv.setImageDrawable(mDrawable);
    }
}

有一个静态的Drawable对象当ImageView设置这个Drawable时,ImageView保存了mDrawable的引用,而ImageView传入的this是MainActivity的mContext,因为被static修饰的mDrawable是常驻内存的,MainActivity是它的间接引用,MainActivity被销毁时,也不能被GC掉,所以造成内存泄漏。

其实避免 Activity 的泄漏的方式可以总结为:不要让生命周期长于 Activity 的对象持有到 Activity 的引用。

在开发中,我们也可以给一些初级的工程师相关的建议,如:

1. 注意单例模式和静态变量是否会持有对Context的引用;

2. 注意监听器的注销;(在Android程序里面存在很多需要register与unregister的监听器,我们需要确保在合适的时候及时unregister那些监听器。)

3. 不要在Thread或AsyncTask中的引用Activity;

你的朋友是不是也在准备面试呢?你可以把今天的题目分享给好友,或许你可以帮到他。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

效果分析的关键是指标能算出来……

看到题目会不会有一些奇怪&#xff1f; 这算什么关键…… 经历过才知道&#xff0c;这是一个不起眼但却极为重要的部分&#xff0c;企业在数据驱动发展进程中必然会遇到指标算不出来的情况&#xff0c;而且随着企业规模的不断扩大&#xff0c;这一问题会持续伴随。“指标能算…

[附源码]Python计算机毕业设计Django学习互助辅助系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

外汇天眼:美国12月Markit制造业PMI初值不及预期 市场担忧经济下滑

美国12月企业活动进一步萎缩&#xff0c;因新订单降至两年半以来最低水平&#xff0c;但需求疲软帮助大幅冷却通胀。标普全球(NYSE:SPGI)周五表示&#xff0c;追踪制造业和服务业的美国综合PMI产出指数预览值本月从11月的46.4降至44.6。这是该指数连续第六个月低于私营部门萎缩…

Python学习-9.1 程序界面-main函数的作用

main函数的两种使用功能 情况1&#xff1a;直接执行本py代码文件时&#xff0c;把包含的代码块视为脚本代码顺序执行&#xff1b; 情况2&#xff1a;当本py代码文件作为其他代码import对象时&#xff0c;不执行如下被包含的代码 下面可以通过程序来更好地了解main函数的作用&a…

java-函数式编程浅谈

了解函数式编程的实际应用场景以及优点。 文章目录什么是函数式编程函数式编程的使用原理解析什么是函数式编程 以数学中的函数作为切入点&#xff0c;只关注参数之间的运算满足某种规则&#xff0c;例如zxy。 那么如何体现在编程中呢&#xff0c;熟知的function定义可以作为…

使用dompdf/dompdf实现生成pdf文件

一&#xff1a;dompdf/dompdf地址 github&#xff1a;https://github.com/dompdf/dompdf packagist&#xff1a;http://packagist.p2hp.com/packages/dompdf/dompdf 二&#xff1a;dompdf/dompdf安装 composer require dompdf/dompdf 三&#xff1a;dompdf/dompdf简单实例…

20221218-19英语学习

今日新词&#xff1a; wit n.智力; 头脑; 理解力; 风趣; 风趣的话语; 智者; 才子 alcohol n.酒精, 乙醇, 含酒精饮料 pub n.酒吧, 酒馆 instructor n.教员&#xff1b;教师 granted adv.&#xff08;表示肯定属实&#xff0c;然后再作另一番表述&#xff09;不错&#xff…

左神:高级进阶班4

1.让N个人过河所需最少船​编辑 2.最长回文子序列 3.最少添加字符让字符串变回文串​编辑 4.回文子串的最少切割次数 5.移除字符使字符串变回文串的方案数​编辑 1.让N个人过河所需最少船 思路&#xff1a;1.排序数组&#xff0c;用基数排序&#xff08;元素&#xff08;体…

计算机毕设Python+Vue学生信息管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

推特群推营销解读

推特群推王发现&#xff0c;许多品牌使用社交媒体作为提供更好客户支持的一种渠道。使用社交媒体可以实时响应客户的需求。通过电子邮件获取品牌有时可能需要长达48小时。但是&#xff0c;通常在社交媒体上回应的时间要快得多。客户将通过你的品牌发推文&#xff0c;你将在手机…

被动与主动信息收集 | 系统性学习 | 无知的我费曼笔记

文章目录信息收集-被动信息收集介绍收集手段收集内容信息用途信息收集-域名解析过程以手段域名解析过程信息收集 DNS**DNS 信息收集-NSLOOKUP****DNS 信息收集-DIG****查询网站的域名注册信息和备案信息**信息收集-被动信息收集手段大全**使用 Maltego 收集子域名信息**子域名介…

【论文简述】PatchmatchNet: Learned Multi-View Patchmatch Stereo(CVPR 2021)

一、论文简述 1. 第一作者&#xff1a;Fangjinhua Wang 2. 发表年份&#xff1a;2021 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、深度学习、Patchmatch、自适应、迭代优化 5. 探索动机&#xff1a;可扩展性、时间、内存占用等效率问题依然没有解决。 While…

【电气安全】关于医疗专用隔离电源系统在医院配电系统中的应用

【摘要】 根据医疗场所分类说明医院尤其是 2 类 医疗场所的接地方案&#xff0c;分析医疗场所自动切断电源措 施&#xff0c;提出校验医疗 IT 系统配出回路长度&#xff1b;说明 RCD、RCM、IMD、IFLS 等的用途和范围&#xff1b;就应急医 院 2 类场所的配电方案进行探讨。 【…

JavaScript刷LeetCode拿offer-双指针技巧(上)

一、前言 一般情况下&#xff0c;遍历数组&#xff08;或者字符串&#xff09;操作&#xff0c;都是采用单指针从前往后或者从后往前依次访问数组&#xff08;或者字符串&#xff09;中的元素。 而对于以下情况&#xff0c;只采用单指针处理&#xff0c;则会徒增时间复杂度和…

统计学习方法 | 概论

一.简介 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科 1.统计学习方法的步骤 ①得到一个有限的训练数据集合 ②确定学习模型的集合&#xff08;模型&#xff09; ③确定模型选择的准则&#xff08;策略&#xff09; ④实现求解…

Python的安装与配置(图文教程)

安装Python 想要进行Python开发&#xff0c;首先需要下载和配置Python解释器。 下载Python 访问Python官网: https://www.python.org/点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS/Linux等)选择下载最新版本的Python安装Python 双击下载好的Python…

五款几乎没人知道的小众软件,按需下载

分享是一种神奇的东西&#xff0c;它使快乐增大&#xff0c;它使悲伤减小&#xff0c;坚持分享一些好用的软件给大家。 1.开源分享工具——ShareX ShareX 是一款 Windows 上开源的截图、文件共享和生产力工具&#xff0c;它是一款功能非常强大的分享工具&#xff0c;只要是免…

【算法】可解释机器学习-ZFNet(Datawhale)

可解释机器学习-ZFNetZFNet算法介绍&#xff1a;AlexNet的提出使得大型卷积网络开始变得流行起来&#xff0c;但是人们对于CNN网络究竟为什么能表现这么好&#xff0c;以及怎么样能变得更好尚不清楚。 因此为了解决上述两个问题&#xff0c;ZFNet提出了一种可视化技术&#xff…

如何治理谐波问题?——有源滤波器

安科瑞 华楠 一、谐波的定义 任何一种周期性非正弦波形都可以看成是由若干种频率不同的正弦波合成的&#xff0c;其中频率为工频的波形我们称为基波&#xff0c;大于1 整数倍基波频率的正弦波分量称为谐波。 总谐波畸变由不同频率的分次谐波合成&#xff0c;各次谐波频率与基…

asp写的百度ocr识别文字-通用文字识别(高精度版)源码下载

今天接到一个客户需求&#xff0c;需要用ASP写一个百度OCR文字识别代码&#xff0c;他的程序都是用ASP写的&#xff0c;所以我们也需要用ASP给他实现百度OCR文字识别&#xff0c;我们在百度AI网站上启用了通用文字识别高精度版&#xff0c;利用高精度板来实现它的业务需求。在上…