内存泄漏分析一

Android内存泄漏案例分析一 最近负责的Gallery模块测试时频繁报出使用一段时间后就发生Crash,通过Log查看发现是OOM引发,本篇文档记录解决该问题的分析过程。 阅读详情


先来想这三个问题

  1. 内存泄露是怎么回事
  2. 内存会泄露的原因
  3. 避免内存泄露

1.内存泄露怎么回事

一个程序中,已经不需要使用某个对象,但是因为仍然有引用指向它垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。
Android的一个应用程序的内存泄露对别的应用程序影响不大。
为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。
Android为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了
这个上限,则会被系统视为内存溢出,从而被kill掉,这使得仅仅自己的进程被kill掉,而不会影响其他进程(如果是system_process等系统进程出问题的话,则会引起系统重启)

2.出现内存泄露原因

1.资源对象没关闭造成的内存泄露
    资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存
2.变量的作用域不一样导致
  变量                              作用域 
  函数变量                           函数内
  成员变量                          整个对象内
  TLS(ThreadLocalStorage)           整个线程
  静态变量                          整个进场内
  Binder(IPC)                      进程间

 因为作用域的不同,作用域大引用到对象都可能不会马上销毁,所以会内存泄露。     
 handle 的内存泄露主要 TLS变量和 activity的生命周期不一样,。
 Thread 引用其他对象也容易出现对象泄露。


3.内存压力过大
  1.图片资源加载过多,超过内存使用空间,例如Bitmap 的使用
  2.重复创建view,没有重复使用  listview,的使用

3.如何避免内存泄露

1.良好的代码规范,清晰代码逻辑
2.对于引用生命不一样的对象,可以用弱引用WeakReferner
3.对于资源对象 使用finally 强制关闭
4.内存压力过大就要统一的管理内存
5.对象重复并且频繁调用可以考虑对象池。
LeakCanary源码学习一:常见内存泄漏分析 以上代码中,我们使用mLeakHandler发送了一个延时任务,同时finish掉HandlerLeakActivity,由于执行延时任务的message还存在于主线程中,它就会持有HandlerLeakActivity中的mLeakHandler的引用(message持有mLeakHandler的引用,mLeakHandler又持有HandlerLeakActivity的引用),这种情况下finish,HandlerLeakActivity是不会被回收的。1、将Handler的声明变为静态的。 阅读详情

相关推荐

Spark Graphx 项目实战(航班飞行网图分析)

航班飞行网图分析一.需要的技能点二.任务描述三.数据探索1.下载数据2.数据格式四.航班飞行网图问题分析1.构建航班飞行网图2.统计航班飞行网图中机场与航线的数量3.计算最长的飞行航线4.找出最繁忙的机场5.找出最重要的飞行航线6.找出最便宜的飞行航线五.代码实现 一.需要的技能点 Spark GraphX API Spark GraphX PageRank Spark GraphX Pregel 二.任务描述 需求概述: 探索航班飞行网图数据 构建航班飞行网图 使用Spark GraphX完成下列任

May_J_Oldhu的博客 1538

如何预防内存泄漏

一、内存泄漏的原因 我们的程序向系统申请分配了一块内存(new/malloc)给对象使用,程序使用完这块内存后没有释放(delete/free),导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。 内存泄露简单来说就是,内存分配与内存释放没有做到一对一的匹配。 二、内存泄漏的危害 堆内存被不断的分配使用,没有及时回收,随着程序的运行,堆内存会慢慢的被消耗殆尽,当其他程序需要内存时,系统无法及时的分配合适的内存供其使用,将会造成程序崩溃。 三、如何预防内存泄漏 1、规范动态内存的使用

djh的博客 4793

论文阅读笔记:Extended Vision Transformer (ExViT) for Land Use and Land Cover Classification

注意力机制驱动的深度模型最近取得了成功,如最具代表性的视觉转换器(ViT),吸引了一波高级研究来探索它们对更广泛领域的适应。然而,遥感(RS)领域中基于Transformer的方法更关注单模态数据,这可能会在充分利用不断增长的多模态地球观测数据时失去可扩展性。为此,我们提出了一种新的多模式深度学习框架,通过在最小修改的情况下扩展传统的ViT,针对土地利用和土地覆盖(LULC)分类任务。

嗑研狗的日常 945

Android 内存泄漏

内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象,虽然Java有垃圾回收机制(GC),但是对于还保持着引用, 该内存不能再被分配使用,逻辑上却已经不会再用到的对象,垃圾回收器不会回收它们。内存溢出:即out of memory, 当你要求分配的内存超过了系统给你的内存时, 系统就会抛出out of memory的异常(每个Android能用的内存是有限的)。比如: 当前应用只剩下4M的空间可用, 但你却加载得到一个需要占用5M空间的图片Bitmap对象, 就会抛出溢出的异常。

追梦的鱼儿 2980

Stata实战:RCS限制立方样条非线性关系建模与P值解读全攻略

本文详细介绍了在Stata中使用RCS限制立方样条进行非线性关系建模的全过程,包括数据准备、节点设置、COX回归模型构建、结果可视化及P值解读。通过乳腺癌临床数据实例,展示了如何捕捉年龄与死亡风险之间的复杂非线性关系,并提供了实用的Stata代码和图形优化技巧。

weixin_30650039的博客 472

linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)

linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)linux驱动由浅入深系列:块设备驱动之二(块设备驱动结构分析)块设备驱动的模型还是基本基于字符设备驱动的,可以简单理解为块设备仅仅增加了操作缓冲区,对用户请求顺序进行队列重拍等等。字符设备驱动的相关分析可以查看本博客相关的博文。 按照本博客的行文习惯,在具体分析块设备驱动代码之前,我们会从整体上了解一下研究对象的特征,以及用户空间...

Radia的专栏 1万+

对内存溢出和内存泄露的简单总结理解

一、什么是内存溢出和内存泄露 内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出。2、内存溢出 (out of memory)::指程序申请内存时,没有足够的内存供申请...

qq_33556350的博客 1万+

ESP32与BH1750光照传感器结合使用的Web服务器案例

请注意,为了使代码正常工作,你需要将代码中的"你的WiFi网络名称"和"你的WiFi网络密码"替换为你自己的WiFi网络凭据。在代码中,我们首先导入了所需的库文件,包括Wire库用于I2C通信,BH1750库用于与光照传感器通信,WiFi库和WebServer库用于创建Web服务器。接下来,我们将编写一个Arduino代码来控制ESP32与BH1750的通信,并将读取到的光照强度值显示在Web服务器上。函数用于处理根路径的请求,其中我们读取光照传感器的值,并将其显示在返回的HTML页面中。

server_api196的博客 617

Android 内存泄露分析

内存泄漏是指内存空间使用完毕后无法被释放的现象。尽管Java有垃圾回收机制(GC),但是对于还保持着引用,逻辑上却已经不会再用到的对象,垃圾回收器不会回收它们。 用户对单次的内存泄漏并没有什么感知,但当可用的空闲空间越来越少,GC就会更容易被触发,GC进行时会停止其他线程的工作,因此有可能会造成界面卡顿等情况。 后续需要分配内存的时候,很容易导致内存空间不足而出现 OOM(内存溢出)。...

hello_1995的博客 4965

LVGL(lv_canvas)

这篇文章介绍了LVGL图形库中的lv_canvas组件,主要内容包括: lv_canvas是一个绘图缓冲区对象,提供丰富的绘图API,可以理解为LVGL的"离屏画布"。 基本使用流程:创建缓冲区->创建canvas对象->设置缓存和尺寸->进行绘图操作。 详细列举了常用的绘图函数,如绘制线条、矩形、文字、图片等。 提供了示例代码展示如何创建画布并绘制一条红色线段。 介绍了canvas的典型应用场景,如动态波形绘制、自定义控件底图等。 对比了canvas与普通img的区别

m0_49476241的博客 1026

Rockchip eMMC寿命监控:SMART信息读取与预防性维护

擦写计数坏块数量温度使用时间。

小灰灰的博客 762

最常见的8个Android内存泄漏问题及解决方法

内存泄漏指的是应用程序中存在一些对象或者资源无法被垃圾回收器回收,导致内存占用不断增加,最终导致设备性能下降。

maniuT的博客 3241

AI产品经理面试宝典第94天:RAG知识库构建与预处理策略面试指南

本文深入解析RAG知识库构建的核心挑战与预处理策略,涵盖文档格式转换、问答对生成及自动化测试全流程,为AI产品经理提供面试必备的实战方法论与避坑指南,助你精准应对技术深度类问题。

打造全国最全的AI Agent开发知识领域的博客 312

【开发篇】一、内存泄漏的分析工具

最后,可以使用Visual VM的采样tab页,查看当前堆里的对象信息。一个对象不再使用后,(因其从GC Root仍有引用链可达)却未被JVM回收,白白占着内存,即内存泄漏,这个效果累积,最后就会OOM。再引入另一依赖:micrometer,将JVM、数据库连接池的信息、磁盘信息等收集上来,组装成Prometheus能识别的格式。查看堆和元空间的走向:这里有size向max扩容的知识点,别看到高的线就认为空间不足。还有,如果是集群化部署,不是上面的java -jar一个jar包,远程就很不方便。

llg___的博客 3803

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android hal层内存泄漏,内存泄漏分析(一)

内存泄漏(memory leak),指程序在申请内存后,一直无法释放已申请的内存空间。内存泄露会消耗内存导致系统卡顿甚至崩溃(OOM),例如bitmap等大对象的泄漏相对容易发现,但对应一些小量的泄漏则容易被忽略,这时则需要运行自动化脚本,进行大量重复的操作才可能发现。1.内存泄漏概述()根据google的profiler对内存泄漏的分类,主要分为6类:Java层泄漏、Native层泄漏、Grap...

weixin_30016191的博客 1074

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android 内存泄漏和OOM分析(一)

OOM(内存溢出),内存泄漏

永远不要停下学习的脚步。 5660

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JAVA内存泄漏分析(一)

Java的内存泄漏文章出处:http://hi.baidu.com/robin300/blog/item/467854df5ea692134954038c.html 问题的提出Java 的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使 有内存

kingmaxno1的专栏 1921

Camera-memory内存泄漏分析(一)

Camera有很多涉及算法的场景,而且每个场景里面buffer的创建与释放也总是有着跟随其算法的特定规律,在这些过程中总会不可避免的出现一些内存泄漏的相关问题需要我们进行分析,本文及以后的几篇文章就对这些算法流程及memory变化定位问题堆栈的方法以及节点进行一些分析,以便以后继续追踪问题与完善技术。 一、不同算法的memory消费监控 1.普通的拍照模式 每次拍照会增加5M的Memory,占用较大memory会进行一些释放 2.加载HDR算法 3.双摄虚化模式 .

Cmatrix204的博客 2524

chrome内存泄露(一)、内存泄漏分析工具

    内存分析使用的工具包括chrome任务管理器、chrome时间轴(低版本是Timeline,高版本对应performance)、chrome memory(低版本是chrome profiles,主要用JS堆快照、JS堆动态分配时间轴)。文中分析所用chrome版本是68。 使用Chrome任务管理器,了解网页使用的内存量。 使用时间轴记录可视化内存使用。 使用堆快照标识分离的DOM...

c11073138的博客 5万+

Android内存泄漏分析及实践(一)

http://blog.youkuaiyun.com/bazhongren/article/details/50911749 http://blog.youkuaiyun.com/bazhongren/article/details/50911749 Android内存泄漏分析及实践(一) 标签: android内存泄露jvmmemoryLeak 2016-03-17 10

u011904605的博客 527

使用Memory Analyzer tool(MAT)分析内存泄漏(一)

使用Memory Analyzer tool(MAT)分析内存泄漏(一)

fantasyagain的专栏 826

使用MAT分析内存泄漏(一)

前言   在平时工作过程中,有时会遇到OutOfMemoryError,我们知道遇到Error一般表明程序存在着严重问题,可能是灾难性的。所以找出是什么原因造成OutOfMemoryError非常重要。现在向大家引荐Eclipse Memory Analyzer tool(MAT),来化解我们遇到的难题。   为什么用MAT   之前的观点,我认为使用实时profiling/monit

6107
上一篇: Android内存泄露案例分析(内存分析工具DDMS和MAT工具)
下一篇: 内存泄漏分析二-线程
wd_cloud
博客等级 码龄19年 733粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值