内存泄漏面面谈

概述

主要介绍了内存泄漏的关注点是对象,对内存问题进行了分类并且确定本文关注点是内存泄漏,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.mzph.cn/diannao/17807.shtml

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

相关文章

企业文件加密软件有哪些?企业文件加密软件排名榜一

企业文件加密软件有哪些?企业文件加密软件排名榜一 企业文件加密软件在市场上种类繁多,尤其是2024年的市场,很多新生加密软件也出现了,那么排在榜一的是哪款加密软件呢? 1、安企神软件: 这款软件支持7天试用…

深入理解Nginx的Location模块

Nginx 是一个高性能的HTTP和反向代理服务器,其中的 location 模块用于根据请求的URI对请求进行路由。本文将详细介绍 Nginx 的 location 匹配规则、优先级,以及如何使用嵌套的 location 配置,并通过示例代码加以说明。 1. Location 基础 lo…

YOLOv8猫狗检测:从SwanLab可视化训练到Gradio Demo网站

基于YOLO模型在自定义数据上做训练,实现对特定目标的识别和检测,是CV领域非常经典的任务,也是AI项目落地最热门的方向之一。 这篇文章我将带大家使用Ultralytics、SwanLab、Gradio这两个开源工具,完成从数据集准备、代码编写、可…

深入剖析:探究编程领域就业热点的地理分布

深入剖析:探究编程领域就业热点的地理分布 在数字化浪潮席卷全球的时代,编程技能无疑成为求职市场的热门标签。然而,对于编程爱好者而言,寻找最佳就业地点却成为一项颇具挑战性的任务。究竟什么地方编程最好找工作?本…

第十八节:带你梳理Vue2: Vue组件中的注意事项和特例

1. Vue组件名推荐使用驼峰命名 现在我们来看看为什么在Vue中推荐注册组件时使用驼峰写法, 在了解这个之前,相信大家应该都能明白为什么在Vue中, 局部组件的使用频率高于全局组件. 推荐使用驼峰写法也是和局部组件有关系 我们先看一个示例 <div id"app"><…

vue el-carousel走马灯实现显示多张(5张)和(7张)

vue el-carousel走马灯实现显示多张&#xff08;5张&#xff09;和&#xff08;7张&#xff09; 父组件不用修改&#xff0c;仅在子组件源码的基础上进行修改即可 直接上代码 <template><div><el-carousel v-if"typeitem5_xybjzq || typeitem5_qdbjzq&quo…

2、PHP 8.1.0-dev 后门远程命令执行漏洞复现

1、青少年ctf&#xff0c;题目PHP后门 2、页面 3、bp抓包发现PHP版本为8.1.0-dev 4、尝试使用以前爆出过的漏洞&#xff08;网上查相关案例&#xff09; User-Agentt: zerodiumvar_dump(5*5); User-Agentt: zerodiumsystem("cat /flag"); 5、查找flag User-Agentt: z…

C语言与内存息息相关的重要概念有哪些?

一、问题 C语⾔、C语⾔和C#语⾔&#xff0c;这三门语⾔&#xff0c;⼀个⽐⼀个加号&#xff08;&#xff09;多&#xff0c;C语⾔没有加号&#xff0c;C有两个加号&#xff0c;C#有四个加号。随着语⾔的发展&#xff0c;⼀个⽐⼀个简单&#xff0c;很多问题系统都给做了&#x…

关于Infinity在不同的编程语言中的含义

在不同的编程语言中&#xff0c;Infinity&#xff08;或等价的概念&#xff09;通常用来表示一个比任何有限数都要大的数值。它是浮点数类型的一个特殊值&#xff0c;用于表示当一个数超过了该类型能够表示的最大值时的情况。例如&#xff0c;在JavaScript、Python、Java、C#等…

双向带头链表实现

目录 一. 逻辑结构图解 1. 节点中存储的值 2.逻辑实现 二. 各种功能实现 1. 创建节点函数 2. 初始化哨兵位 3. 尾插 4. 头插 5. 尾删 6. 头删 7. 打印链表值 8. 查找数据&#xff0c;返回节点地址 9. 指定地址后插入节点 10. 删除指定地址节点 11. 销毁链表 三.…

vue2 自定义ant design vue (组件) 的message内容 及 vue 定义公用方法流程

1 modules.js import { Button, message } from ant-design-vue; function downFile(){ alert(下载) } export default { // 成功提示 success(_this,content,size = 14) { // message.success({ // content : h => // _this.$createElement(span, [ // …

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统,支持电子病历四级,saas模式

JAVA云HIS医院系统源码 云HIS运维平台源码 融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;saas模式 HIS系统就是医院信息管理系统&#xff0c;HIS系统是整个医院信息化的核心&#xff0c;门诊、住院、药房、药库等都是由HIS系统来承载起来的&#xff0c;所以…

【Spring】深入学习AOP编程思想的实现原理和优势

【切面编程】深入学习AOP编程思想的实现原理和优势 前言AOP的由来及AOP与代理的关系AOP的实现方式详解静态代理动态代理 AOP的应用场景记录日志权限控制数据库事务控制缓存处理异常处理监控管理 AOP的底层实现全流程解析Spring AOP的简介动态代理的实现原理Spring AOP的实现原理…

rockeylinux 搭建k8s 1.28.10

1.关闭防火墙 systemctl stop firewalld systemctl disable firewalld 2.关闭selinux # 临时禁用selinux # 将 SELinux 设置为 permissive 模式&#xff08;相当于将其禁用&#xff09; setenforce 0 sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config 3.网…

tinyrenderer-渲染器着色

整理了代码&#xff0c;创建了一个相机类&#xff0c;控制镜头 class Camera { public:Camera(Vec3f cameraPos, Vec3f target, Vec3f up):cameraPos_(cameraPos), target_(target), up_(up) {}Matrix getView();Matrix getProjection(); private:Vec3f cameraPos_;Vec3f targ…

安装Chrome扩展程序来 一键禁用页面上的所有动画和过渡。有那些扩展程序推荐一下

要安装Chrome扩展程序来一键禁用页面上的所有动画和过渡&#xff0c;以下是一些推荐的扩展程序&#xff1a; Toggle CSS Animations and Transitions 功能&#xff1a;此扩展程序允许用户轻松地在网页上切换CSS动画和过渡的开启与关闭状态。使用方法&#xff1a;安装后&#x…

2024年区块链,物联网与信息技术国际会议(ICBITIT 2024)

2024年区块链&#xff0c;物联网与信息技术国际会议&#xff08;ICBITIT 2024&#xff09; 2024 International Conference on Blockchain, Internet of Things, and Information Technology 会议简介&#xff1a; 2024年区块链&#xff0c;物联网与信息技术国际会议&#xff…

ML307R OpenCPU UDP使用

一、UDP通信流程 二、示例 三、UDP通信代码 一、UDP通信流程 ML307R UDP 是使用LWIP的标准的通信,具体UDP流程可以自行百度 二、示例 实验目的:实现把接收的数据再发送到服务端 测试网址:UDP电脑端测试网址 因为是4G,所以必须用外网的 /* 测试前请先补充如下参数 */…

Flutter 中的 CupertinoTimePicker 小部件:全面指南

Flutter 中的 CupertinoTimePicker 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;CupertinoTimePicker 是 Cupertino 组件库中的一个 widget&#xff0c;它提供了一个 iOS 风格的时间和日期选择器。这个选择器允许用户通过滚动选择器来选择时间&#xff0c;非常适合需…

halcon3D学习备份

目录 xyz_to_object_model_3d 1 gen_object_model_3d_from_points 1 object_model_3d_to_xyz 2 segment_object_model_3d 2 prepare_object_model_3d 4 distance_object_model_3d 5 area_object_model_3d 7 project_object_model_3d 8 surface_normals_object_model_3d 9 sampl…