内存泄漏相关内容总结(上)

双参数威布尔分布(Weibull分布)参数计算(根据故障数据,求双参数威布尔分布的参数详细步骤) 根据故障数据求威布尔分布参数步骤 根据众多文献研究,设备故障数据大多服从指数分布、威布尔分布或对数正态分布。其中威布尔分布较为常用,本文主要介绍威布尔分布的简单应用,并根据某设备故障数据为例简单介绍威布尔分布参数的计算方法。 参考文献11参考文献22 1.双参数威布尔分布的概率密度函数、概率分布函数、可靠度函数: 2.预处理故障数据 将故障数据按时间排序,假设设备分别在以下时间点失效:11.1 、23.5、58.4……则将此时间从小到大排序。并计算中位秩。中位秩的计算公式如下: 其中i表示第几个数据,n 阅读详情
    好久没有认真的写博客了,草稿箱中静静躺着好几篇,但总是不能把他们写完,一直没有写的心情把,罪过...

废话一句说完,进入今天的正题:内存泄露的相关知识。

一、内存问题

很多时候我们是需要查看自己的应用内存占用情况,比如当出现闪退,异常退出时:
1、界面内存占用:比如我们的启动画面,如果出现OOM的问题,这个时候可以通过差看内存情况,如果确是内存占用比较大就可以考虑做相应优化
2、内存泄漏的初步查找:这个和直接的OOM有些差别,虽然他最终也会导致OOM。方法:反复打开、关闭可能内存泄漏的界面,如果每次打开关闭之后内存都有所增加,就可以初步判断为内存泄漏。正常情况应用是进入界面内存占用有所增加,但是离开后内存会降到之前的水平。


二、内存泄漏与内存溢出(OOM)的区别与联系

内存溢出做android开发的各位应该是比较熟悉,图片加载稍微不小心就会导致out of memory的错误,这个错误出现的原因就是我们的应用去申请内存时系统无法再分配导致的。所以我们需要有节制的使用内存。

和C++相比,java的一个很大特点就是有GC,我们不需要去专注内存的释放与回收。但是,这也不是绝对的:当我们的代码出现问题导致GC无法及时的回收相关的内存时就会导致内存泄漏。这句不算太规范的描述(语文太差,见谅)他的重点是什么呢——GC无法及时的回收相关内存——这将导致我们的内存占用越来越多——最终的体现就是OOM。

希望这个简单的描述,各位可以理解什么是memory leak和OOM。

三、android(DDMS)给我们的提示

(1)、logcat中的信息

关于内存的信息,logcat会给我们一些提示信息,比如:

<span style="font-size:14px;">D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms</span>

这行信息怎么理解?它包含哪些信息呢?通过DDMS的文档我们可以得知这个信息的格式如下:

<span style="font-size:14px;">D/dalvikvm(dvm pid): <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time></span>
这行信息我们主要关注的是:GC_Reason,他主要有下面几种:

GC_CONCURRENT()
A concurrent garbage collection that frees up memory as your heap begins to fill up.
GC_FOR_MALLOC(当我们的应用申请内存时触发)
A garbage collection caused because your app attempted to allocate memory when your heap was already full, so the system had to stop your app and reclaim memory.
GC_HPROF_DUMP_HEAP()
A garbage collection that occurs when you create an HPROF file to analyze your heap.
GC_EXPLICIT(当我们手动点击DDMS>heap>Cause GC按钮时会触发)
An explicit garbage collection, such as when you call gc() (which you should avoid calling and instead trust the garbage collector to run when needed).
GC_EXTERNAL_ALLOC()
This happens only on API level 10 and lower (newer versions allocate everything in the Dalvik heap). A garbage collection for externally allocated memory (such as the pixel data stored in native memory or NIO byte buffers).
当我们在app在出现问题时可以根据这些信息做初步判断。比如频繁出现GC_FOR_AMLLOC则预示着我们一直在申请内存。

(2)、heap页签的内存信息

这个我们可以更详细的看到内存的分配与使用。启动方法:点击DDMS中我们的进程>上部的Update heap按钮>Cause GC即可,如下图:



四、通过内存快照更精准的查找内存信息

当我们出现内存泄漏问题是,初学者可能会一头雾水,不知道如何解决,从何下手。这个时候我们就可以考虑使用mat对我们的内存进行详细的分析,找到内存泄漏点,做相应的处理。

(1)、Shallow size和Retained Size

在进行内存分析之前我们需要首先了解这两个概念。

Shallow size
Shallow size就是对象本身占用内存的大小,不包含其引用的对象。常规对象(非数组)的Shallow size有其成员变量的数量和类型决定。数组的shallow size有数组元素的类型(对象类型、基本类型)和数组长度决定。Shallow size of a set of objects represents the sum of shallow sizes of all objects in the set.在32位系统上,对象头占用8字节,int占用4字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节。故此,对于String对象实例来说,它有三个int成员(3*4=12字节)、一个char[]成员(1*4=4字节)以及一个对象头(8字节),总共3*4 +1*4+8=24字节。根据这一原则,对String a=”rosen jiang”来说,实例a的shallow size也是24字节。

Retained Size
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。

为了更好的理解retained size,不妨看个例子。
把内存中的对象看成下图中的节点,并且对象和对象之间互相引用。这里有一个特殊的节点GC Roots,这就是reference chain的起点。

从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。
所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。
对于obj2,它的retained size是:在左图中,是obj2和obj4的shallow size的和;在右图中,是obj2、obj3和obj4的shallow size的和。

总之,retained size是一个整体度量,有助于理解内存结构和对象图中的依赖关系并找到根节点。

(2)、HPROF file——内存快照文件

首先这个文件可以通过点击DDMS中Update heap右侧的Dump HPROF file得到(这个有时候可能会比较慢,特别是内存占用高的时候,需要等一会,出现hprof: dumping heap strings to "[DDMS]".即代表已经触发)。

得到这个文件之后,我们还需要使用SDK的platform-tools文件夹下的“hprof-conv”工具进行转换,然后就可以使用内存分析工具查看了。转换方法:

<span style="font-size:14px;">hprof-conv heap-original.hprof heap-converted.hprof</span>
(3)、内存分析工具MAT

这个是专门做内存分析的工具。通过它我们可以打开刚才转换后的到hprof文件,进行内存分析。每次都点击保存,转换,然后打开还是比较麻烦的。这个时候我们可以考虑使用eclipse的mat插件。

这篇就先写到这里。下一篇简单介绍如何通过MAT查找内存泄漏的问题。

参考:

https://developer.android.com/tools/debugging/debugging-memory.html

http://blog.youkuaiyun.com/kingzone_2008/article/details/9083327


告别功能限制:Win11家庭版无损升级专业版全攻略 本文详细介绍了如何将Win11家庭版无损升级到专业版的全过程,包括升级前的准备、两种官方升级方案(Microsoft Store购买和使用产品密钥)以及命令行升级方法。升级后可解锁远程桌面、组策略编辑器和BitLocker加密等高级功能,适合需要更多商业功能的用户。 阅读详情

相关推荐

手把手教你编写I2C读写EEPROM代码(驱动层实现)

从底层寄存器配置到时序控制,详解如何编写可移植的I2C读写EEPROM代码,覆盖起始信号、地址帧、数据收发及ACK应答等关键环节,确保在STM32、ESP32等主流平台稳定运行,真正落地i2c读写eeprom代码需求。

weixin_35756130的博客 509

python memory usage_python程序内存泄漏调试记录(转)

问题描述调试python程序时,用下面这段代码,可以获得进程占用系统内存值。程序跑一段时间后,就能画出进程对内存的占用情况。def memory_usage_psutil():# return the memory usage in MBimport psutil,osprocess = psutil.Process(os.getpid())mem = process.memory_info()[...

weixin_39602967的博客 572

@transactional滥用导致数据源连接池耗尽问题

@transactional滥用导致数据源连接池耗尽问题

qq_43205267的博客 1201

算法部署之内存泄露(gunicorn+flask+onnx+pytorch)

Gunicorn(Green Unicorn),flask+算法内存泄露解决办法。

hdudb的博客 3104

论文笔记--Spatial-Temporal Fusion Graph Neural Networks for Traffic Flow Forecasting

Summary 在交通预测问题上,现有的框架通常利用给定的空间邻接图和复杂的机制来建模空间和时间关联。作者认为使用给定的空间邻接图会限制模型的有效时空相关性学习,并且它们通常使用单独的模块来实现空间和时间相关性,或者只使用独立的组件来捕获局部或全局的异质依赖关系,割裂了时空依赖关系。为此作者提出一种时空融合图神经网络用于交通预测。提出一种数据驱动的“时间图”生成方法,以此来补偿空间图可能没有反映的相关性。提出一种新的交通预测方法。 Problem Definition 交通预测中的挑战 以上图为

chenxino的博客 1757

Android以太网开关流程分析

Android以太网开关流程分析 一、引言   在Android 以太网服务启动流程中我们启动了EthernetService(ES),NetworkManagementService(NMS)等服务,其中ES作为Binder的服务端,向客户端EthernetManger提供了调用接口的引用。因此,应用可以通过EthernetManger来访问以太网的相关接口。本篇文章将从APP调用以太网的使能和关闭的接口流程作为切入点来分析,以太网框架中,上层app是如何将指令传递到底层。图1-1所示为以太网使能和关闭

franc521的博客 6115

python multiprocessing Pool 进程池内存上涨问题解决方法

python multiprocessing Pool 进程池 内存溢出问题 就是内存不断地 上涨 最后导致内存溢出严重死机都是 有可能的

东方佑 1977

深入解析GEM5 McPAT NoC功耗模型:从arbiter电容计算到微架构关联

本文深入解析GEM5 McPAT NoC功耗模型,重点探讨arbiter电容计算与微架构的关联。通过拆解动态功耗公式和四类电容的物理本质,揭示能量与功率的转换关系,并提供参数调试和模型精度优化的实战技巧,帮助开发者更准确地预测和优化NoC功耗。

weixin_29305313的博客 203

cpu 内存占用比较高的解决方案

查找服务器php慢日志的方法 ps -ef|grep "php-fpm: master process" vim /usr/local/php-5.4.39/etc/php-fpm.conf 开启 request_slowlog_timeout = 5 slowlog = /data/logs/php/$pool.log.slow $pool = [www] tail -100 www.l...

gb4215287的博客 1072

自抗扰控制(ADRC)理论与工程实践:6.1 离散时间ADRC的推导

本文系统阐述了自抗扰控制(ADRC)的离散化方法,重点对比了前向欧拉法和基于零阶保持器(ZOH)的精确离散化两种方法。前向欧拉法计算简单但精度较低,稳定性受采样周期约束;ZOH法精度高但对大采样周期更鲁棒。文章详细推导了跟踪微分器、扩张状态观测器和控制律的离散形式,分析了采样周期选择的关键因素,为ADRC的数字实现提供了理论指导。

技术工作者 198

西门子博图v16安装密钥提示报错:CryptAcquireContext MS_DEF_PROV Error of containger opening...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 3310

宝塔安装PHP占用多少内存,宝塔面板内存占用服务器内存占用高,服务器内存内存满载100%彻底解决方法...

如果我们建中大型的网站,最好使用服务器来建网站。很多使用服务器建网站的站长都会遇到这样的问题:自己服务器安装的宝塔面板的内存使用率很高,有时达到90%-100%。宝塔面板服务器内存使用率高怎么解决服务器内存占用率如此之高呢?下面介绍一下宝塔面板服务器内存使用率高的解决方法。以前也说明过宝塔面板本身是不怎么占用内存的《宝塔面板占用多大内存?》如果运行网站宝塔面板占用非常高,就要看看是不是安装软件过多...

weixin_34355360的博客 3155

Imagiq AI-PQ 图像质量增强模块详解:联发科 ISP 中的 AI 图像管线实战解析

随着智能手机影像系统对图像质量要求的持续提升,联发科在其 Imagiq ISP 中引入了 AI 驱动的图像增强模块——AI-PQ(AI-based Picture Quality),通过 AI 模型对亮度、色彩、噪声、锐度等多个维度进行动态调节与增强,实现更加智能化和个性化的图像输出效果。AI-PQ 在实际工程中已成为影响照片风格、视频观感和多模组一致性的核心能力之一。本文围绕 Imagiq 平台最新一代 AI-PQ 模块(2024-2025年量产平台为基础),结合实机开发与调优经验,深入剖析其各子模块的算

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1423

内存泄漏检测相关内容

通过拦截 malloc,free函数,然后以宏定义的方式,改造malloc, free: malloc的时候根据指针地址写一个文件,free的时候根据指针地址删除这个文件。最后根据留下的文件就可以知道哪个new没有释放内存了。_malloc__FILE____LINE___free__FILE____LINE__方法1的弊端是,最好是用在一个.c文件中,如果文件较多的话就不太适用。

cs的专栏 225

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

希望进一步扩展C#内存泄漏的相关内容,可能包括更多陷阱、更深入的分析、额外的代码示例,或者探讨特定的场景、工具和优化策略

11. Timer未正确停止问题描述:System.Timers.Timer或System.Threading.Timer等定时器如果未在适当时候停止,会持续运行并持有相关对象的引用,导致内存泄漏。我将在之前介绍的10大陷阱(7个初始+3个补充)基础上,再补充2个常见的内存泄漏陷阱(共12个),并提供更详细的讲解、代码示例,以及内存泄漏的检测和预防的高级技巧。希望进一步扩展C#内存泄漏的相关内容,可能包括更多陷阱、更深入的分析、额外的代码示例,或者探讨特定的场景、工具和优化策略。示例代码:csharp。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 951

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

adb查找内存泄漏

adb查找内存泄露

xiaxing163的专栏 706

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++ 内存泄漏讲解

一、含义 内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 二、后果 最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的 bug。 只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能不良(并且逐渐降低)到内存完全用尽。 更糟的是,泄漏的程序可能会用掉太多内存,以致

Hyc_cheng的博客 454

内存泄漏,走开!

内存泄漏,走开! 作者: Staffan Larsen 翻译: glorywine 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 英文原文地址: http://dev2dev.bea.com/pub/a/2005/06/memory_leaks.html 中文地址: http://www.matrix.org.cn/resou...

weixin_30695195的博客 91

最快速度找到内存泄漏

 最快速度找到内存泄漏 

cnrandy 的专栏 972

一个跨平台的 C++ 内存泄漏检测器(转载)

一个跨平台的 C++ 内存泄漏检测器吴咏炜(adah@netstd.com)2004 年 3 月         内存泄漏对于C/C++程序员来说也可以算作是个永恒的话题了吧。在Windows下,MFC的一个很有用的功能就是能在程序运行结束时报告是否发生了内存泄漏。在Linux下,相对来说就没有那么容易使用的解决方案了:像mpatrol之类的现有工具,易用性、附加开销和性能都不是很理想。本文实现一

gujianhua的专栏 1461

内存泄漏。

学习笔记:内存泄漏百度百科 1.什么是内存泄漏? 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 2.导致内存泄漏的原因? 分配一个内存块并使用其中未经初始化的内容 释放一个内存块,但继续引用其中的内容 子函数中分配的内存空间在主函数出现异常中断时、或主函数对子函数返回的信息使用结束时,没有对分配的内存进行释放; 程序实现过程中分配的临时内存在程序结束时,没有释放临时内存 c语言内存泄漏

qq_47104322的博客 357

一张图看懂memwatch内存泄漏检测原理

李子的备忘录 2271

内存溢出与内存泄漏

内存溢出与内存泄漏 1.内存溢出 2.内存泄漏

xiaotai1234的博客 243

pytorch中内存泄漏问题

https://blog.youkuaiyun.com/no__names/article/details/106087249

qq_38327769的博客 1361

内存泄漏及检测方法讲解

内存泄漏及检测方法讲解

lys07962000的专栏 201

CJSON内存泄漏的注意事项

CJSON使用注意

weixin_29898767的博客 732
上一篇: android网络开源框架volley(五)——volley的一些细节
下一篇: Mac下对APK进行反编译
ttdevs
博客等级 码龄15年 388粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值