解决内存泄漏问题,Profiler工具的使用介绍

什么是内存泄漏

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

以上是官方针对内存泄漏的说法。说的通俗一点,应该释放的内存没有被正常释放,就是内存泄漏。当我们程序出现内存泄漏后,轻则影响运行速度,重则内存溢出,造成程序崩溃。

内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存

所以,当我们程序出现疑似内存泄漏的时候,千万要引起重视。

如何识别内存泄漏

找出程序中有内存泄漏风险的代码,我们可以通过人工去review代码,找出内存泄漏并解决掉;也可以借助adb命令去观察相关状态;也可以借助AndroidStudio提供的Profiler工具来检测。

Activity 内存泄漏检测用法

主要用到Profiler模块:

image.png

页面泄漏案例:

创建两个Activity 一个为默认Activity A,一个demo的Activity B,A启动B,然后在按下返回退出B页面,B中代码如下:

class ProfilerMainActivity : AppCompatActivity() {
    companion object {
  		//定义一个静态变量,引用Activity实例
        var refAct: ProfilerMainActivity? = null
    }


    private lateinit var student: Student


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_profiler_main)
        //让静态变量一直持有当前实例
        refAct = this


        student = Student()
        student.sayHello()
    }
}

接下来,我们先使用Profiler工具的Capture heap dump抓取一段内存堆数据:

A启动B后:

image.png

image.png
此时还是正常的情况

退出B

当我们退出B页面时重新抓取一段:

image.png
可以看出Activity的ondestroy生命周期已经执行完成,按道理页面已经被销毁,内存中不应该继续有该对象,而该对象正是被上面的静态变量引用导致GC一直不能释放该对象。

模拟解决该问题

在上面页面中finish操作:

class ProfilerMainActivity : AppCompatActivity() {
  //省略。。。。
    override fun finish() {
        super.finish()
        refAct = null
    }
}

再重复上面抓取步骤抓取一次内存数据:

image.png
可以看出,内存中仍然存在该对象,但是该对象已经没有谁引用他,那么 他将会在下一次GC回收垃圾时,被回收掉,这里我们直接强制GC执行垃圾回收,看看猜测是否正确:

image.png

抓取

可以发现,ProfilerMainActivity实例已经不再出现在内存当中。

使用Record Java/Kotlin allocations

主要记录一段时间中堆的对象个数、销毁时间

还是上面的代码 这次我们看Studen这个对象,执行操作A–》B–》A–》B,然后多次强制执行垃圾回收,抓取数据如下

看上图,Studen被创建两次,所以整个过程一共记录了两个对象,1和2,他们之间的区别是1中 Dealloc Time 不为空,没有Instance details 因为Student在第一次启动页面时创建,退出B页面后,被GC回收了 整个活跃时间为1s05ms,而2中Dealloc Time不为空 说明还没被回收,Instance details中记录了这个对象的堆栈信息,还在堆中活跃。全文讲解了在Android开发中经常遇到的内存泄漏问题,以及如何使用Profiler工具检测。更多有关Android性能优化相关的技术可以参考《Android性能优化解析》点击可以查看详细的性能优化板块。

总结

Profiler工具为了我们能方便查看内存泄漏的地方,专门提供了一个View app heap 分类来报告哪些页面泄漏,同时,我们还可以在里面查看非页面类有没有正常被释放,比如单例,当我们退出某个功能后,手动把单例置为空(”销毁“),我们只需在强制GC后抓取一段内存数据查看该对象是否仍在活跃即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

牛客网刷题笔记131111 Python实现LRU+二叉树先中后序打印+SQL并列排序

从学校步入职场一年多,已经很久没刷过题了,为后续稍微做些提前的准备,还是重新开始刷刷题。 从未做过计划表,这回倒是做了个计划表,希望能坚持吧。 刷题比较随性且量级不大,今天就写了2个算法2个sql&#x…

Interactive Analysis of CNN Robustness

Interactive Analysis of CNN Robustness----《CNN鲁棒性的交互分析》 摘要 虽然卷积神经网络(CNN)作为图像相关任务的最先进模型被广泛采用,但它们的预测往往对小的输入扰动高度敏感,而人类视觉对此具有鲁棒性。本文介绍了 Pert…

SSH 远程登录 WSL

更新ssh设置 sudo apt-get update sudo apt-get remove openssh-server sudo apt-get install openssh-server 编辑网络配置 sudo vi /etc/ssh/sshd_config (1)修改ssh服务监听端口和监听地址 (2)修改ssh服务允许使用用户名密码…

linux入门---信号量

目录标题 为什么会有信号量信号量的概念信号量的接口和操作什么是环形队列单消费者生产者环形队列的模拟实现准备工作构造函数和析构函数push函数的模拟实现pop函数的模拟实现RingQueue完整代码测试代码 多生产多消费的环形队列 为什么会有信号量 在上一篇文章当中我们写过这么…

无人机航迹规划:五种最新智能优化算法(GRO、SWO、COA、LSO、KOA)求解无人机路径规划MATLAB

一、五种算法(GRO、SWO、COA、LSO、KOA)简介 1、淘金优化算法GRO 淘金优化算法(Gold rush optimizer,GRO)由Kamran Zolf于2023年提出,其灵感来自淘金热,模拟淘金者进行黄金勘探行为。VRPTW&am…

Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法——使用布局、Spacer等控件

Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法—使用布局、Spacer等控件 Chapter1 Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法—使用布局、Spacer等控件Chapter2 Qt Creator中布局器详解01. 概述02. 开发环境03. 布局器概述04. 布局属性设置05. 弹簧条属性…

VBA_MF系列技术资料1-217

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…

算法通关村第八关-青铜挑战二叉树的经典题目

大家好我是苏麟 , 今天来说二叉树的经典题目 二叉树的双指针 所谓的双指针就是定义了两个变量,在二叉树中有时候也需要至少定义两个变量才能解决问题,这两个指针可能针对一棵树,也可能针对两棵树,我们姑且也称之为“双指针”吧。…

AI通义灵码能够帮你写通达信选股公式么?

答案是否定的 先不说语法错误,注释错误,就说AI压根不理解炸板和涨停板; 算了,股票交易AI千万别来掺和,会死的很惨的。

Linux C/C++ 入侵检测系统(IDS绕过技巧)

入侵检测系统(IDS)是一种网络安全设备,其主要功能是对网络传输进行即时监视,并在入侵检测系统(IDS)是一种网络安全设备,其主要功能是对网络传输进行即时监视,并在发现可疑传输时发出…

python升级pip的时候一直失败

如图,一直提示使用 python.exe -m pip install --upgrade pip 进行升级pip,但是执行这句命令又不成功.然后综合了几篇文章以后使用了下面的命令可以升级了 python -m pip install --upgrade pip --user -i https://mirrors.aliyun.com/pypi/simple/ 主要是在推荐的语句上使用…

赶紧收藏!阿里内部使用的127页k8s实战手册,不能再详细了!

2022 年 12 月 8 号Kubernetes 发布了1.26新版本,此版本中有两个突出的新功能,它们有可能改变用户与 Kubernetes 交互的方式,此外,其他功能将使集群管理员的工作更轻松。 说起来,Kubernetes从诞生初期就广泛受到业界的…

金字塔原理小节

目录 第1章 为什么要用金字塔结构 一、归类分组,将思想组织成金字塔 二、奇妙的数字“7” 三、归类分组搭建金字塔 四、找出逻辑关系,抽象概括 五、自上而下表达,结论先行 第1章 为什么要用金字塔结构 如果受众希望通过阅读你的文章、听…

玩了个锤子游戏小程序搭建流程:探索深度与逻辑的结合

随着移动互联网的普及,小程序已经成为了越来越多用户的选择。在这个背景下,玩了个锤子游戏小程序应运而生,它为用户提供了一个全新的游戏体验。那么,如何搭建这样一个小程序呢?本文将为大家详细介绍玩了个锤子游戏小程…

WPS数组

一、创建数组方法和数组的读取、修改、写入 数组是值的有序集合,其中的值叫作元素。每个元素有一个数值表示的位置,叫作索引,数组中的不同元素可以是不同数据类型。 function demo(){var arr1[99,"人","abc",[3,4,5]];…

【tgowt】更新thirdparty

更新完毕后是这样的 之前有过构建但是不能用在owt-p2p项目中,会有崩溃? 【tgowt】cmake转ninja vs构建现在好像都更新到108了 submodule比较麻烦 只修改这里的还不行:一旦git submodule init 后,再改这里的似乎晚了?如果能成功clone就有生成 还必须要改这里的 折腾好几次才…

由于找不到 d3dx9_43.dll,无法继续执行代码。重新安装程序可能会解决此问题

电脑出现d3dx9_43.dll缺失的问题,通常是由于DirectX组件未安装或损坏导致的。为了解决这个问题,我为您提供了以下四个解决方法: d3dx9_43.dll解决方法1. 使用dll修复程序修复 首先,使用系统文件程序dll进行修复操作非常简单&…

Python进行多维数据分析

多维数据分析是对数据的信息分析,它考虑了许多关系。让我们来介绍一些使用Python分析多维/多变量数据的基本技术。 从这里找到用于说明的数据的链接。(https://archive.ics.uci.edu/dataset/111/zoo) 以下代码用于从zoo_data. csv读取2D表格…

Spring Cloud学习(三)【Nacos注册中心】

文章目录 认识 NacosNacos 安装使用 Nacos 完成服务注册Nacos 服务分级存储模型集群负载均衡策略 NacosRule根据权重负载均衡Nacos 环境隔离(命名空间)Nacos 和 Eureka 的区别 认识 Nacos Nacos 是阿里巴巴的产品,现在是 SpringCloud 中的一…