内存泄漏分析

news2024/7/6 18:26:38

一、什么是内存泄漏?

内存泄漏是指在程序运行过程中,分配给程序的内存空间在不需要时没有被正确释放或回收的情况。

二、Java层内存泄漏。

  • Android应用程序中Java层常见的内存泄漏情况:
  1. Context引用泄漏:Android中的Context是一个常见的泄漏源。例如,在生命周期长于Context的类中持有Context引用,导致Context无法被垃圾回收。
  2. 非静态内部类和匿名内部类:非静态内部类和匿名内部类会隐式持有外部类的引用,如果它们的生命周期比外部类更长,就会导致外部类无法被垃圾回收。
  3. Handler引起的泄漏:使用Handler时,如果Handler持有Activity或Fragment的引用,并在消息队列中排队等待处理,那么这些Activity或Fragment无法被垃圾回收。
  4. 单例模式:不正确的使用单例模式可能导致对象长时间存活在内存中,造成内存泄漏。确保单例对象在不需要时能够释放相关引用。
  5. 监听器和回调:如果注册的监听器和回调没有及时取消注册,这些监听器和回调持有的引用可能阻止相关对象的垃圾回收。
  6. 静态引用导致的泄漏:使用静态引用可能导致对象在应用程序的整个生命周期内持续存在,即使不需要也不会释放,从而导致内存泄漏。
  7. 长时间的后台任务:在Android应用中进行长时间的后台任务,如果不正确的处理,可能会导致相关资源无法释放,从而引发内存泄漏。
  8. 未关闭的资源:Bitmap资源、文件句柄、数据库连接、网络连接等未关闭也可能导致内存泄漏。

三、Native层内存泄漏。

  • Android应用程序中Native层常见的内存泄漏情况:
  1. 内存分配未释放:在C/C++代码中使用malloc、new等函数分配内存,但未使用free、delete等函数释放,导致内存泄漏。
  2. 未释放的本地引用:在JNI中,如果分配了本地引用(Local Reference)但未正确释放,会导致内存泄漏。
  3. 未释放的全局引用:在JNI中,如果分配了全局引用(Global Reference)但未正确释放,会导致内存泄漏。
  4. 资源未释放:打开文件、网络连接、数据库连接等资源,但在不在需要时未正确关闭,导致资源泄漏。
  5. 未释放的线程和锁:在本地代码中创建了线程、锁等资源,但在不在需要时未正确释放,可能导致线程或锁资源泄漏。
  6. 循环引用:在C++等编程中,对象之间可能存在循环引用,使引用计数无法降为零,从而导致内存泄漏。
  7. 异常处理不当:在本地代码中发生异常时,如果未正确释放已分配的内存和资源,会导致内存无法释放。

四、内存泄漏如何检测。

进行内存泄漏检测建议使用Android Profiler的内存分析器,它能够显示内存使用的实时图表,并且可以捕获内存快照、强制执行垃圾回收以及动态跟踪内存分配和回收。

  1. Capture heap dump:获取当前内存快照。
  2. Record native allocations:记录一段时间内C/C++内存分配和回收。
  3. Record Java/kolin allocation:记录一段时间内Java/Kotlin对象的分配和回收。
  4. 内存使用详情:显示应用当前的内存使用详情。
  5. 强制执行垃圾回收。
  • Java内存泄漏检测

Java内存泄漏检测分两种场景:

1、严重泄漏,内存增加速度快。

对于严重的内存泄漏,内存泄漏对象的数量会明显增加,快速占据程序内存的大部分空间,对于这种泄漏场景,通过Record Java/kolin allocation功能,记录该时间段内Java对象的分配和回收。其中数量大而且占用内存远超其它对象的对象即为内存泄漏的对象。

标号1显示了对象的分配详情(数量、内存),通过这些数据,我们能够大致判断出来泄漏的对象,然后通过编号2,根据对象创建的堆栈信息(如果没有堆栈信息,则该对象在JNI中创建),定位到具体的对象。

2、轻微泄漏,内存缓慢增加。

对于轻微的内存泄漏,需要经过长时间的运行,让泄漏的内存占据程序的大部分空间,再通过Capture heap dump功能,获取当前的内存快照。

然后通过标号1查看数量大、内存占用大的对象,通过标号2进一步分析该对象引用情况,查找不被释放的原因,最后定位到问题。

  • Native内存泄漏

在C/C++中,内存管理相对更加手动,没有内置的机制来直接捕获内存状态,因此没法实现内存快照功能,但是通过Android Profiler的内存分析器,通过Record native allocations功能,可以动态跟踪C/C++内存分配和回收,从而实现native内存泄漏检测。

在Native内存泄漏检测过程中,不管是严重泄漏,还是轻微泄漏,都需要让泄漏的内存占据整个程序内存的大部分空间,这样方便我们检测到内存泄漏的位置。

标号1应该选择Array by callstack,便于我们查看调用信息,标号2 Module Name,进行分析时,应该选择应用中明确使用的so库,标号3是函数的编码,通过这些信息,可以定位到具体函数,最后找出泄漏的原因。

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

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

相关文章

【Flutter】Flutter 使用 flutter_rating_bar 实现评分条指示器

【Flutter】Flutter 使用 flutter_rating_bar 实现评分条指示器 文章目录 一、前言二、简介三、安装和基本使用四、实际业务中的用法五、完整示例六、总结 一、前言 大家好,我是小雨青年,很高兴与大家分享 Flutter 中的一个非常实用的组件:f…

马斯克谈 Facebook 不开源算法

导读虽然马斯克与扎克伯格的 “八角笼中” 之约没有达成,但很显然,马斯克并不打算就此罢休。既然没能在线下大战一场,那自然不会错过在线上 “出招” 的机会。 他转发了一则推文,并说道:“在地球上,Facebo…

STM32调试时卡在B 0x20000000

分析原因,发现sw下,硬件接reset管脚,所以需要设置debug reset 选择 hw reset

Excel中将文本格式的数值转换为数字

在使用excel时,有时需要对数字列进行各种计算,比如求平均值,我们都知道应该使用AVERAGE()函数,但是很多时候结果却“不尽如人意”。 1 问题: 使用AVERAGE函数: 结果: 可以看到单元格左上角有个…

2023年9月重庆/上海/深圳NPDP产品经理国际认证火热招生

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

锐捷BGP【基础二】--尚文网络敏姐

BGP协议 这节主要学习IBGP和IGP之间的区别与联系, BGP 路由信息交互,了解BGP的安全性,BGP协议的基本配置,如何建立IBGP、EBGP对等体,引入与传递路由。 目录 BGP协议 BGP基础概念 IBGP和IGP的不同 BGP 路由信息交…

优化 | 带有未知评估成本和预算约束的多步贝叶斯优化

论文解读者:胡明杰 编者按: 贝叶斯优化是一种处理黑盒函数优化的常用方法. 大多数的贝叶斯优化方法假设评估成本是同质的. 然而, 在实际问题中,评估成本往往是异质且未知的. 此外,现有的考虑异质评估成本的方法并不能很好地处理…

Ansible之变量

一)Ansible变量介绍 我们在PlayBook⼀节中,将PlayBook类⽐成了Linux中的shell。 那么它作为⼀⻔Ansible特殊的语⾔,肯定要涉及到变量定义、控 制结构的使⽤等特性。 在这⼀节中主要讨论变量的定义和使⽤ 二)变量命名规则 变量的…

软件设计师(二)程序设计语言基础知识

程序设计语言是为了书写计算机程序而人为设计的符号语言,用于对计算过程进行描述、组织和推导。 一、程序设计语言概述 1、基本概念 (1)低级语言和高级语言 计算机硬件只能识别由 0、1 组成的机器指令序列,即机器指令程序&…

ssm+vue开放式教学评价管理系统源码和论文

ssmvue开放式教学评价管理系统源码和论文121 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身…

如何炒伦敦金

由于疫情的影响,目前世界上多个国家降低存款利率,以推动经济发展,由此也引发了比较严重的通胀问题,尤其是在俄乌冲突之后,国际油价不断上涨,加大了这种通货膨胀的影响。进行伦敦金投资是一种规避通胀的好方…

一文速学-让神经网络不再神秘,一天速学神经网络基础(六)-基于数值微分的反向传播

前言 思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,…

电脑耳机没声音怎么解决?教你5个方法!

“刚在电脑上插上耳机准备听歌,但是为什么一直都没有声音呢?这是怎么回事呢?自己捣鼓了很久还是没有找到解决方法,有没有大佬可以指点我一下呀?” 有时候我们可能会在电脑上听音乐、看视频等。如果是在公共场合&#x…

【狂神】Spring5笔记(四)之Mybatis和事物的整合

一、整合Mybatis方式一 目录结构: 大致内容结构: 主要难点就在于applicationContext.xml中相关配置的理解 代码图片如下 这个类就专门用于对象的创建就可以了 测试类: 实现类: SqlSessionTemplate 二、整合Mybatis方式二 相关代码…

作为一家游戏开发公司,有哪些经验可以分享?

在竞争激烈的游戏开发行业中,成功的游戏开发公司需要不断学习、创新和积累经验。作为一家经验丰富的游戏开发公司,我们愿意分享一些我们认为对于取得成功至关重要的经验和教训。这些经验涵盖了游戏开发的各个方面,从创意构思到发布和营销。希…

图片懒加载指令

场景和指令用法: 电商网站的首页通常会很长,用户不一定能访问到页面靠下面的图片,这类图片通过懒加载优化手段可以做到只有进入视口区域才发送图片请求 在vue官网中查看的 将一个自定义指令全局注册到应用层级(常见的做法&#xf…

睿趣科技:抖音小店多久可以做起来

随着社交媒体的迅猛发展,抖音成为了全球最受欢迎的短视频平台之一,吸引了数以亿计的用户。在抖音上,人们不仅可以分享自己的生活、才艺和创意,还可以创业经营抖音小店。但是,很多人都想知道,一个抖音小店到…

深度学习技巧应用27-最全的深度学习学习计划的设定与应用,看完更加自信

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用27-最全的深度学习学习计划的设定与应用,看完更加自信。本文将带大家了解不同类型的深度学习模型,包括卷积神经网络(CNN)、循环神经网络(RNN)等,并学习调整模型超参数、优化算法等技巧。通过参与实际的深度学习项…

这五款wifi检测工具,不要太好用

前言 不断有朋友问到关于wifi测试软件有哪些?WiFi信号和声音一样,强弱都是可以测量的,检测WiFi的方法有很多,作为普通的家庭用户,我们有时需要测试WiFi的速度、信号强度、周围WiFi干扰等等,那么wifi信号如…

Git 回顾小结

Git是一个免费开源,分布式的代码版本控制系统,版主开发团队维护代码 作用:记录代码内容,切换代码版本,多人开发时高校合并代码内容 Git常用命令 命令作用注意git -v查看Git版本git init初始化本地Git仓库git add 文件…