内存泄漏面面谈

news2024/10/7 4:25:49

概述

主要介绍了内存泄漏的关注点是对象,对内存问题进行了分类并且确定本文关注点是内存泄漏,15种内存泄漏判断方式,hprof文件的用法和分析过程,以及memory profiler工具一些基本概念,最后提到了如何触发内存泄漏问题

内存泄漏的关注点——对象占据的内存

  • 本该回收的对象,无法被垃圾处理器回收;
  • 程序不再使用的对象,无法被垃圾处理器回收;
  • 在页面生命周期销毁后,页面持有、创建过的对象无法被垃圾处理器回收;
  • 在任务(线程、Service、广播)结束后,任务持有、创建过的对象无法被垃圾处理器回收

Android内存问题概述

内存抖动的表现形式:

  1. 忽高忽低,锯齿状

内存泄漏的表现形式:

  1. 页面或任务已经结束,相关的对象仍然被GC root索引,导致垃圾回收器无法回收,内存片段仍然存在

内存溢出的表现形式:

  1. App可用内存已到达系统规定的上限,如X型号手机规定单个App最大可分配内存为196mb
  2. 系统能为App分配的内存不足,系统可分配内存已经到达上限,如系统可用只有1mb,app需要20mb

Android中内存泄漏的判断方式

判断一个对象是否无法被回收,最佳的判断方式是定义清楚这个对象预期的生命周期,通常对象是随着页面、任务的生命周期产生和消亡的,Android中可以借此机制判断是否存在泄漏现象:
PS:“是否存在于hporf文件里”,是笔者用于等价替换原文“未被回收”的字样

  1. Activity:通过查看Activity#mDestroyed属性来判断Activity是否已经销毁,如果为true,表明该Activity已经被标记为销毁状态,此时hprof文件中若仍然存在此Activity,则表明这个Activity占据的内存处于泄漏状态;
  2. Fragment:通过Fragment#mFragmentManager属性来判断该Fragment是否处于无用状态,如果mFragmentManager为空,且hprof文件中若仍然存在此Fragment,则表明Fragment占据的内存处于泄漏状态;
  3. View:通过un wrapper#mContext获得Activity,如果Activity不为空,则按照判断Activity的方式判断Activity是否泄漏
  4. ContextWrapper:通过unwrapper ContextWrapper获得Activity,如果Activity不为空,则按照判断Activity的方式判断Activity是否泄漏
  5. Dialog,通过判断mDecor是否为空。mDecor为空,表明Dialog处于不被引用的状态,mDecor仍然存在在hporf里且为空,则表明Dialog泄漏了
  6. MessageQueue:通过判断MessageQueue#mQuitting或mQuiting是否退出,如果该值是true且未被回收,则认为是泄漏。
  7. ViewRootImpl:通过ViewRootImpl是否为空来判断,为空表明处于无用状态,为空且未被回收则被认为是泄漏
  8. Window:通过Window#mDestroyed来判断window是否处于无用状态,mDestroyed为true且未被回收,则认为是泄漏
  9. Toast:拿到mTN,通过mTN#mView是否为空来判断当前Toast是否已经hide,如果mView为空,表明Toast已经hide,此时Toast未被回收则认为是泄漏
  10. Editor:Editor是用于TextView处理editable text的辅助类,通过ditor#mTextView为空来判断Ediator是否处于无用状态;如果mTextView为空且未被回收则认为Editor泄漏了
    内存泄漏的典型 场景
  11. 非静态内部类、匿名内部类持有外部类对象的引用:常见的如Listener、CallBack、Handler、Dialog
  12. 非静态的Handler,持有Activity,Message持有Handler,Message被MessageQueue持有,MessageQueue持久存在,导致Activity不会被释放
  13. 资源对象未关闭:数据库连接、Cursor、IO流使用完后未close
  14. 属性动画:未及时使用cancel关闭;Animator持续存在,导致Animator持有的Activity、Fragment、View泄漏(Animator#updateListener一般都是匿名内部类,匿名内部类的问题参考场景1)
  15. 逻辑问题:广播监听后未及时解注册;

Hprof文件

Hprof文件导出

  • 通过调用Debug.dumpHprofData(String filePath)方法来生成hprof文件
  • 通过执行shell命令adb shell am dumpheap pid /data/local/tmp/x.hprof来生成指定进程的hprof文件到目标目录

Heap分区:

  1. app heap:当前App在堆中占据的内存
  2. image heap:系统启动镜像,包括启动期间预加载的类
  3. zygote heap:所有App的父进程,所有App共享zygote的内存空间,zygote预加载了许多资源和代码,供所有App读取

Instance View:

  1. depth:从gc root到当前对象的引用链最短深度。被gc root引用到的对象不会被回收。
  2. 个人收获:depath = 0,表示不被gc root引用,即会被垃圾回收器回收。
  3. 个人收获:常见gc root有5种——局部变量、Activity threads、静态变量、JNI引用、类加载器
  4. native size:native对象占据的内存大小
  5. shallow size:对象本身占用的内存,何为对象本身?不包括它引用的其他实例
  6. 个人收获:shallow size = 类定义+ 父类变量所占空间大小 + 类成员变量所占空间 + [ alignment]
  7. 类定义:固定为8Byte
  8. 父类变量所占空间大小:当前类继承了其他类的成员变量,显然这些变量是占用空间的
  9. 自身变量:当前类的成员变量,如果是基本数据类型,则按基本类型计算;如果是引用数据类型,则固定为4byte,当前类仅持有变量名,
  10. alignment:指位数对齐,目的是让shallow zie的值为8的倍数,如某个类A,前三项计算结果未15byte,则shallo size为了达到8的倍数,会设置一个alignment值,凑够16byte。
  11. retained size:Retained Size是指, 当实例A被回收时, 可以同时被回收的实例的Shallow Size之和

Instance View易混淆概念:

shallow size:
Shallow Size是指实例自身占用的内存, 可以理解为保存该’数据结构’需要多少内存, 注意不包括它引用的其他实例
retained size:
实例A的Retained Size是指, 当实例A被回收时, 可以同时被回收的实例的Shallow Size之和
在这里插入图片描述
图中A, B, C, D四个实例, 为了方便计算, 我们假设所有实例的Shallow Size都是1kb
删除D实例:垃圾回收期会移除D实例;D实例的Retained Size=Shallow Size=1kb
删除C实例:垃圾回收器会移除C和D实例;C实例的Retained Size = C实例的Shallow Size + D实例的Shallow Size = 2kb
删除B实例:垃圾回收器会移除B实例,因为C仍然被A引用,所以C不会被移除,同理D也不会被移除;B实例的Retained Size=Shallow Size=1kb
删除A实例:垃圾回收器会移除B、C、D实例;A实例的Retained Size=4kb

怎么从prof文件内分析内存泄漏?

熟能生巧——memory profiler

实时预览功能区:

在这里插入图片描述

Hprof文件预览区:

在这里插入图片描述

怎么触发泄漏

  1. 旋转屏幕
    在不同的 activity 状态下,先将设备从竖屏旋转为横屏,再将其旋转回来,这样反复旋转多次。旋转设备经常会使应用泄漏 Activity、Context 或 View 对象,因为系统会重新创建 Activity,而如果应用在其他地方保持对这些对象其中一个的引用,系统将无法对其进行垃圾回收。
  2. 切换App至前台
    在不同的 Activity 状态下,在应用与其他应用之间切换(导航到主屏幕,然后返回到您的应用)。
  3. 断开后链接网络
  4. 锁屏后亮屏
  5. 频繁操作
    1. 频繁点击按钮,如编辑用户信息,点击保存按钮,触发保存业务
    2. 频繁进入页面,如重复进入-退出某个页面
    3. 频繁刷新页面,如重复下拉加载更多

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

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

相关文章

护网2024-攻防对抗解决方案思路

一、护网行动简介 近年来,网络安全已被国家上升为国家安全的战略层面,网络安全同样也被视为维护企业业务持续性的关键。国家在网络安全治理方面不断出台法规与制度,并实施了一些大型项目和计划,如网络安全法、等级保护、网络安全…

Nacos服务分级存储模型

Nacos服务分级存储模型 Nacos把服务拆分为三级 一级 服务 二级 集群 三级 实例 将某服务 例如订单模块 拆分为北京 上海 杭州集群 为了避免跨地域调用集群实例 就近原则先调用本地的实例 不行再去跨地域调用 提高容灾处理能力 负载均衡: 当服务去请求本地的集群实例 实例很多的…

ssm136公司项目管理系统设计与实现+jsp

公司项目管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本T公司项目管理系统就是在这样的大环境下诞生,其可以帮助管理者在…

SRS视频服务器应用研究

1.SRS尝试从源码编译启动 1.1.安装ubuntu 下载镜像文件 使用VMWare安装,过程中出现蓝屏,后将VM的软件版本从15.5升级到17,就正常了。

基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】

前言 该系统采用SpringBootVue前后端分离开发,前端是一个单独的项目,后端是一个单独的项目。   技术栈:SpringBootVueMybatisRedisMysql   开发工具:IDEA、Vscode   浏览器:Chrome   开发环境:JDK1…

Java类和包

一.什么是包 粗暴的讲,包就是一个文件夹 、在src路径下,可以创建一个软件包,这个就是包 我们来创建一个包 这里我们看到,我们创建了两个包,在俩包中分别创建一个Java文件 如果我想在text中调用text2,看…

【MiniCPM-V】win10本地部署踩坑

尝试最新大模型MiniCPM-V,题主的3080Ti 16G显存,CUDA12.3,选用模型openbmb/MiniCPM-Llama3-V-2_5。 踩坑经过 Could not create share link. Please check your internet connection or our status page: https://status.gradio.app 解决方…

云服务器如何使用局域网服务器的磁盘空间

说明 云服务器中的磁盘空间不足时,想要开通更多的磁盘空间,但奈何价格太贵,开不起 刚好局域网中有闲置的服务器空间可以拿来用,这里我们直接使用Samba服务来共享文件夹,使用frp来进行内网穿透; 1、磁盘挂…

ICPC训练赛补题集

ICPC训练赛补题集 文章目录 ICPC训练赛补题集D - Fast and Fat (负重越野)I-路径规划G. Inscryption(邪恶铭刻)NEW Houses D - Fast and Fat (负重越野) 原题链接:原题链接 题意:体重大的背体重小的速度不变,体重小的背体重大的速度会变化&a…

家用洗地机哪个品牌好?家用洗地机排行榜前十名

随着洗地机逐渐进入大众视野,这种集吸、拖、洗功能于一体的清洁工具,凭借其高效便捷的特点,成为家庭清洁的新宠。洗地机不仅能够减少地面清洁时间,节省体力,还能提高清洁效果。然而,面对琳琅满目的洗地机品…

多系统集成的项目周期为何普遍较长?

在现代企业的运营中,各种信息系统的集成已成为提升效率和竞争力的关键。然而,当工厂的ERP系统需要与MES、SRM、WMS、CRM等其他系统集成时,项目周期往往长达一年以上,这不仅耗费时间、人力和财力,还可能影响企业的正常运…

体验SmartEDA的高效与便捷,电子设计从未如此简单

SmartEDA:革新电子设计,让高效与便捷触手可及 在快节奏的现代生活中,科技日新月异,各行各业都在寻求更高效、更便捷的解决方案。对于电子设计行业而言,SmartEDA的出现,无疑是一场革命性的变革。它以其高效…

腾讯云联络中心ivr调用自定义接口

1&#xff0c;java代码&#xff1a;http接口 RequestMapping(value "/getMsg5", method RequestMethod.POST) public Map<String, String> index(RequestBody Map<String, String> params) {String id params.get("id");HashMap<String…

ssm137基于SSM框架的微博系统+vue

微博系统网站的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就…

惯性测量单元M-G366PDG提供低误差系数的解决方案

人形机器人、自动驾驶的快速发展&#xff0c;促成了惯性测量单元(IMU)的爆火市场。据相关研究报告统计&#xff0c;IMU全球市场规模从2018年的99.94亿美元增加至2021年的135.95亿美元预计2027年将达到222.53亿美元&#xff0c;2021年至2027年复合增长率达8.56%。而由于智能技术…

USST新生训练赛div2+div3题解

目录 前言题解部分B Ichihime and Triangle(800)题目大意题解代码实现 C Kana and Dragon Quest game(900)题目大意题解代码实现 J Squares and Cubes(800)题目大意题解代码实现 F Double Sort(1200)题目大意题解代码实现 I Minimize the Thickness(1100)题目大意题解代码实现 …

三十六计的笔记

系列文章目录 三十六计的笔记 文章目录 系列文章目录1、瞒天过海2、围魏救赵3、借刀杀人4、以逸待劳5、趁火打劫6、声东击西7、无中生有8、暗渡陈仓9、隔岸观火10、笑里藏刀11、李代桃僵12、顺手牵羊13、打草惊蛇14、借尸还魂15、调虎离山16、欲擒故纵17、抛砖引玉18、擒贼擒王…

【LeetCode算法】第88题:合并两个有序数组

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;首次想到的解法&#xff1a;定义一个mn长度的辅助数组&#xff0c;从头遍历这两个数组&#xff0c;谁小就放进辅助数组中并且对应往后走&#xff0c;最后使用memcpy函…

基于Java实现的图书管理系统

前言&#xff1a;该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能&#xff0c;分为两个用户群体&#xff1a;管理者和普通用户。使用了类与对象&#xff0c;封装继承多态&#xff0c;抽象类和接口等Java基础知识。 一.思路 面向对象三部曲&#xff1a;找对象&…

K8s种的service配置

什么是service 官方的解释是:   k8s中最小的管理单元是pod&#xff1b;而service是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法;   Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种服务发现机制。 你可以在 Pod 集合中运行代码…