Android内存优化之内存泄漏

Android:内存泄漏检查&内存优化 Android:内存优化,内存泄漏检查 阅读详情

Android系统的内存泄漏

使用过C/C++的朋友都知道使用对象都需要特别小心,一不留神就会忘记对象内存的释放。Java语言的好处之一就是内存使用大多数时候都不需要自己手动释放,这个直接交给GCch处理。虽然Dalvik虚拟机支持垃圾回收,但是并不意味着我们就可以随便使用内存或者不关心内存的使用情况,在内存紧张的移动设备上,内存的使用尤为重要。

内存泄漏通常是使用者没正确的使用对象或者对象的引用关系没注意导致内存迟迟得不到释放,造成系统卡顿,严重的会导致重启。内存泄漏的产生有很多种情况,通常小的内存泄漏并不会被人为发现或者注意,但当一个应用程序内存泄漏足够多的时候就会导致应用程序崩溃。

严重的内存泄漏情况:

(1)嵌入式或者便携式设备上,因为本身内存有限,内存使用不当会导致严重的后果;

(2)系统关键驱动上,因为频繁调研,会导致系统内存泄漏越来越严重;

(3)系统内部泄漏,Android系统本身也是由代码所成,所以也会存在内存使用不当的情况;

(4)后台程序一直运行,不断消耗内存,导致内存一直高占用率;

(5)游戏视频或者画面频繁的重绘;

(6)等等。

 

为什么会内存泄漏

简单来说就是对象的内存无法被GC所回收探测,GC通过对象可达性或者引用链等方式判断对象的状态,如果当前对象无其他对象引用或者不可达,就会把对象标记为可回收状态,等待被回收。

引用的强弱,可达性的引用级别:

(1)强引用:一般无其他生命都是强引用,级别最高,当内存非常吃紧且只有强引用的时候会GC;

(2)软引用:只要有内存足够,就一直保持对象,一般用于缓存;

(3)弱引用:比软引用更弱,当内存回收时马上回收这部分内存;

(4)虚引用:根本不会在内存中保持的对象,一般用于finalize()方法时进行特殊清理的过程;

据generation进行GC,堆可分为年轻代、老年代、永久代(Java8之后没有永久代,改为Metaspace);

(1)年轻代

绝大多数的对象都会分配在年轻代中,同时大部分对象ye也在年轻代中就被回收,其中,年轻代又分为三部分:一个Eden区和两个Survivor区,默认的比例为8:1。从比例上看Eden区分配的比例大,也可以猜测出在Eden区存在的对象会较多,当进行第一次Minor GC时,大部分对象会被回收掉,一些存活下来的对象会迁移到Survivor区,每进行一次Minor GC,这些存活下来的对象都会增加一岁,当第一个Survivor区满了的时候就会把这些存活下来的对象复制到第二个Survivor中,当第二个Survivor区也满了的时候就会把存活下来的对象复制到老年代中。经历了n次GC后存活在laon老年代的对象,我们可以把这些对象视为生命周期长的对象。

(2)老年代

在年轻代经过n次回收存活下来的对象,一般是长生命周期对象;

(3)永久代(持久代或者称为方法区)

一般用于存放静态文件,如今Java类、方法等,持久代对垃圾回收没有显著影响,GC回收的目标仅针对方法区的常量池和类型卸载 ;在JDK8后被元空间(Metaspace)取代;

 

Shallow Size和Retained Size等

要了解对象的存储长度,需要知道对象的Shallow Sizehe和Retained Size,其中Shallow Size我指对象本身占用的内存大小,不包含其他对象的引用(这点很重要);

Shallow Size:Java语言中一切都是对象(除了基本类型外),比如int类型占4字节,String类型中包含三个int成员、一个char[ ]成员、以及一个对象头,所以一个String对象占 3*4+1+4+8 = 24字节,从而可以计算得到相应的内存大小。

Retained Size:指该对象的Shallow Size,外加上该对象能直接或者间接访问到的对象的Shallow Size,简单理解就是该对象引用链的内存之和;

Heap Size:堆栈分配给App的内存大小;

Allocated:以及分配的内存大小,该应用进程所分配到的内存大小,当应用程序被回收或者退出时,该值会相应变小;

 

内存泄漏调试工具

通常来说使用adb可以观察出应用程序是否内存泄漏,但是如果想进一步了解泄漏的详细信息,我们就不得不借助一些工具来分析了。

(1)DDMS工具,adt或者Android studio本身自带的调试工具,可用DDMS生成.hprof文件,然后通过生成几份不同的.hprof文件进行对比,查找出具体泄漏的对象;

(2)MAT:全称为Memory Analyzer Tool,是一款bucu不错的内存分析调试工具,使用MAT分析内存泄漏的思路在于对象的引用关系,分析出具体哪个对象没有被释放,从而对位da到代码当中。MAT的下载地址:http://www.eclipse.org/mat/

(3)Leak Canary:一款第三方库,使用起来非常简单,只要依赖一些包和相应的简单配置就可以,适合新手;

(4)adb shell:利用命令行来调试,推荐这个进阶(大神估计都是直接命令行工作的哈哈哈);

 

 

一篇文章教你搞定内存泄漏与排查流程——安卓性能优化 前言 内存泄漏可以说是安卓开发中常遇到的问题,追溯和排查其问题根源是进阶的程序猿必须具备的一项技能。小盆友今天便与大家分享一下这方面的一些见解,如有理解错误或是不同见解,可以于评论区留言我们进行讨论,如果喜欢给个赞鼓励下吧。 目录 1、JAVA内存解析 2、JAVA回收机制 3、四种引用 4、小结 5、安卓内存泄漏排查工具 6、内存泄漏检查与解决流程 7、常见的内存泄漏原因 1、JAVA内... 阅读详情

相关推荐

Android内存优化(三)避免可控的内存泄漏

内存泄漏向来都是内存优化的重点,它如同幽灵一般存于我们的应用当中,有时它不会现身,但一旦现身就会让你头疼不已。因此,如何避免、发现和解决内存泄漏就变得尤为重要。这一篇我们先来学习如何避免内存泄漏。

Android进阶三部曲 - 刘望舒 4526

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

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

maniuT的博客 3241

Android 内存优化使用profile 和 MAT 工具进行内存泄漏检测

内存抖动 & 内存泄漏 & 内存溢出(OOM) 内存抖动 含义:短时间内有大量对象创建销毁,它伴随着频繁的GC。 查看:可以使用android studio自带的profile工具检测。 现象:在profile中的内存图像就像是心电图一样,忽上忽下,如下图所示: 常见场景:循环使用字符串拼接,比如我们项目的日志打印等 预防内存抖动方法: 避免在循环中创建对象,能复用的尽量复用。 ...

安卓兼职framework和app工程师的博客 814

Android 内存优化&内存泄漏处理

匿名内部类的泄漏原因:匿名内部类会隐式地持有外部类的引用.当外部类被销毁时,内部类并不会自动销毁,因为内部类并不是外部类的成员变量,它们只是在外部类的作用域内创建的对象,所以内部类的销毁时机和外部类的销毁时机是不同的,所以会不会取决与对应对象是否存在被持有的引用.

qq_33552379的博客 1911

【车联网】通用安卓Android内存优化策略:使用 Android Studio Profiler(Memory Profiler)监控内存泄漏、定位大对象和验证优化效果的全流程操作指南

以下是使用监控内存泄漏、定位大对象和验证优化效果的,结合实战场景分步解析,通过以上步骤,可高效利用定位90%以上的内存问题,结合代码优化形成完整的内存管理闭环,确保应用在各种场景下的内存稳定性。

奶爸的编程之路,也就一周冷个三天 1032

Android性能优化:内存泄漏检测与优化

答:内存泄漏是指程序申请的内存由于某些原因无法被释放,导致这部分内存一直被占用。静态变量或单例持有Activity等上下文引用非静态内部类创建了长生命周期的实例(如Thread)未取消注册的监听器和回调(如广播接收器、传感器监听等)Handler引起的内存泄漏(非静态Handler类持有外部Activity引用)资源对象未关闭(如Cursor、File、Stream等)WebView使用不当第三方库使用不当(如注册监听器但未注销)避免静态变量持有Activity或View引用。

Ya-Jun 的博客 598

android runnable内存泄漏,这个Runnable是否可以防止内存泄漏?

我是Java的初学者,已经创建了一个简单的JavaAndroid代码片段,在1.5秒后我在Runnable中将TextView从Hello World更改为Hola Mundo.它完美无缺,基本上WeakReference应该防止这种内存泄漏发生吗?我怀疑是否在设备方向发生时绝对没有内存泄漏.我很想检查这个,但无法在我模拟的Android中改变方向.这是代码:package com.example...

weixin_29001327的博客 611

SpringBoot使用mybatis-plus的自动代码生成器

一.SpringBoot使用mybatis-plus+自动代码生成 使用mybatis-plus可以自动帮我们生成通用的 controller,service,dao,mapper 二.加入依赖 <!-- MP 核心库 --> <dependency> <groupId>com.baomidou</groupId> <artif...

农民娃儿的博客 2263

Android中的内存泄露问题

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 Android中发生内存泄露的常见情形如下: 1.handler引起的内存泄露 private TextView textView; private Button button; private Handler m...

u012556114的博客 1460

银河麒麟V10+QT6.0中文输入法环境搭建全攻略(附镜像加速技巧)

本文提供了在银河麒麟V10操作系统上为QT6.0搭建中文输入法环境的完整实战指南。文章详细介绍了从系统准备、镜像源优化、QT6安装器获取与加速安装,到编译Fcitx5输入法插件依赖库、深度配置环境变量与项目的全流程。重点分享了使用国内镜像源加速安装的技巧,解决了国产化开发中QT应用无法输入中文的常见难题,旨在帮助开发者快速构建稳定高效的开发环境。

weixin_29204749的博客 393

C#实战:基于ONNX与SCRFD/ArcFace的高效人脸识别系统开发

本文详细介绍了如何在C#环境中,利用ONNX Runtime高效部署SCRFD人脸检测与ArcFace人脸识别模型,构建一个完整的、高性能的人脸识别系统。内容涵盖环境搭建、模型推理、人脸对齐、特征提取等核心模块,并提供了从Demo到生产系统的优化思路与实战代码,为.NET开发者提供了一套开箱即用的解决方案。

weixin_29061821的博客 488

[Android进阶]Java、Android 内存泄漏总结

Java、Android 内存泄漏总结内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收。最近自己阅读了大量相关的文档资料,打算做个 总结 沉淀下来跟大家一起分享和学习,也给自己一个警示,以后 coding 时怎么避免这些情况,提高应用的体验和质量。我

陶程的博客 5306

微信开放标签wx-open-launch-app样式失效?手把手教你正确设置点击区域(附完整代码)

本文详细解析了微信开放标签`wx-open-launch-app`样式失效和点击无响应的常见问题,提供了完整的解决方案和代码示例。通过分析标签内部实现机制,指导开发者正确设置点击区域和样式,确保跨平台兼容性和用户体验优化。

joy55的博客 320

Android内存泄漏优化总结

Android内存泄漏优化总结什么是内存?Android中的内存是手机的RAM。主要包括如下几个部分: 1、寄存器 位于Cpu内部,速度最快。 2、栈 用于存放基本类型以及引用变量。 3、堆 主要用于存放数组和new出来的对象,它由垃圾回收器进行管理(GC)。对内存的优化也是处理的堆内存。 4、静态存储区 存储应用运行一直存在的数据(static变量) 5、常量池 存放定义的常

Coder_android 8504

避坑指南:vue-print-nb打印隐藏元素与空白页的那些事儿

本文深入解析了使用vue-print-nb插件时,打印出现空白页及隐藏元素问题的根本原因与解决方案。核心在于理解浏览器打印原理,并通过CSS媒体查询精准控制样式。文章提供了从重置根元素高度、处理隐藏元素到控制分页的完整避坑指南,帮助开发者彻底解决打印样式难题。

weixin_29008691的博客 437

反激变压器设计学习笔记

反激变压器匝比感量设计

m0_55419117的博客 5262

Android性能优化之常见的内存泄漏

前言对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary、MAT等工具来检测应用程序是否存在内存泄漏,MAT是一款强大的内存分析工具,功能繁多而复杂,而LeakCanary则是由Square开源的一款轻量第三方内存泄漏检测工具,当它检测到程序中有内存泄漏的产生时,它将以最直观的

【博客地址迁移到】:https://zhengxiaoyong.com 3万+

公交车调度排班优化算法研究与实现

本文提出的公交车调度排班优化算法基于遗传算法,能够较好地处理公交车调度排班问题,使得车辆数量和运营时间得到平衡,公交车的使用效率得到了优化。在模拟的公交车路线中,使用本文所提出的算法,得到了一组较优的公交车调度排班方案。其中,车辆数量的多少会影响到公交车的行驶速度和等候时间,而运营时间的长短则会直接影响到公交车的使用效率和成本。本文基于遗传算法,通过随机生成种群、选择、交叉、变异等操作,逐步优化种群中个体的适应度,最终得到较优的公交车调度排班方案。以下是本文中所使用的Matlab代码实现,供参考。

PixelLoom的博客 872

android 内存优化-内存泄漏

内存泄漏在Android内存优化是一个比较重要的一个方面,很多时候程序中发生了内存泄漏我们不一定就能注意到,所有在编码的过程要养成良好的习惯。总结下来只要做到以下这几点就能避免大多数情况的内存泄漏:构造单例的时候尽量别用Activity的引用;静态引用时注意应用对象的置空或者少用静态引用;使用静态内部类+软引用代替非静态内部类;及时取消广播或者观察者注册;耗时任务、属性动画在Activity销毁时记得cancel;文件流、Cursor等资源及时关闭;

anhuilee的博客 1441

C# 实现 Modbus 通信全教程(支持 TCP 和 RTU,含完整错误处理)

环境准备:安装 NModbus4 库,明确设备参数(IP/串口、地址、数据类型);连接设备:TCP 用 TcpClient,RTU 用 SerialPort,注意超时和参数匹配;读写数据:根据数据类型调用对应方法(读保持寄存器用 ReadHoldingRegisters);错误处理:捕获连接、超时、协议等异常,针对性排查问题。掌握这些后,即可轻松实现与工业设备的 Modbus 通信,为上位机开发提供稳定的数据交互能力。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2066

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android内存泄漏总结和性能优化技巧

对于许多开发者来说,安卓性能优化往往是一个比较棘手的问题。由于安卓设备的种类繁多,硬件配置各不相同,因此优化的方法和策略也各不相同。同时,安卓应用的开发周期较长,往往需要不断地迭代和更新,因此优化也需要不断地持续和优化。 学习安卓性能优化的知识和技巧,是每个安卓开发者必备的技能之一。通过掌握安卓性能优化的基本原理和方法,我们可以更加深入地了解安卓设备的工作机制,理解应用的性能瓶颈,从而采取有效的优化策略和措施,提高应用的性能和稳定性,提升用户的满意度和留存率。

weitao_666的博客 1361

Devexpress16.2.6破解工具

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

Android-内存泄漏问题多多,怎么优化?,安卓开发权威指南

1.2.2 垃圾收集算法 前面我们通过引用计数法或可达性分析找到了哪些对象是可以被回收的,本节将重点阐述JVM中的垃圾回收器是如何将这些不可用对象进行回收,即垃圾收集算法,主要包括标记-清除算法、复制算法、标记-整理以及分代收集等。相关介绍如下: 标记-清除算法 标记-清理算法是最基础的垃圾收集算法,它的实现分为两个阶段,即“标记”和“清除”,其中,标记的作用为通过引用计数法或可达性分析算法标记出所有需要回收的对象;清除的作用为在标记完成后统一回收所有被标记的对象。这种算法比较简单,但是缺陷也比较明显,

m0_64604893的博客 1167

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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内存优化,常见内存泄漏及优化方案

前言 在安卓开发中,一些不好的编程习惯会导致应用出现内存泄漏的情况。 1. 单例导致的内存泄漏 单例模式在开发中是非常常见的,但因为单例模式的静态特性使得其生命周期同应用生命周期一样长,如果一个对象没有用处了,但单例还持有它的引用,那么在整个生命周期中都不会被回收,就可能导致内存泄漏。如下代码: public class Singleton { private static Singleton singleton = null; private Context mContext; public

qq_41915623的博客 437

【Android进阶笔记】内存优化(内存泄漏优化)

文章目录1. 内存抖动1.1. 现象1.2. 避免2. 内存泄漏2.1. 内存泄漏的检测与定位2.2. 常见的内存泄漏2.2.1. 静态变量内存泄漏2.2.2. 非静态内部类、匿名内部类内存泄漏2.2.3. 单例模式内存泄漏2.2.4. 系统服务内存泄漏2.3. 防止内存泄漏2.4. LeakCanary 工具 1. 内存抖动 短时间内创建大量对象,挤占 Eden 区,导致频繁 MinorGC,内存就会发生抖动。 1.1. 现象 ​ MemoryProfile内存图为锯齿状,并伴随大量的白色垃圾

Android学习笔记 1061

android 内存泄漏代码,记一次Android内存泄漏的优化经历

原标题:记一次Android内存泄漏的优化经历本文作者作者:黄俊彬链接:https://www.jianshu.com/p/c8e691a69086本文由作者授权发布。文章不难,但为真实的一次优化经历,值得借鉴。1背景通过线上收集的日志分析,存在部分OOM的日志,故通过leakcanary进行内存泄漏追踪。引用链日志在开发的过程中,leakcanary报出了内存泄漏,详细的日志如下: 并且全局有其...

weixin_42382944的博客 190

Android 内存优化篇 - 使用profile 和 MAT 工具进行内存泄漏检测

前言 在 Android 开发中,内存泄漏这个名词我想大家都不陌生,但是真正注意到这个问题并去解决的估计很少,因为内存泄漏表面上并不会表现出对app的任何影响,加之现在的手机配置与内存都挺高的,所以对于中小型app来说,可能不怎么去处理也几乎看不出来,但是作为一名android 开发者,你肯定和我一样不能忍受这种瑕疵吧,那 就撸起袖子干它就完事了 内存抖动 & 内存泄漏 & 内...

Darry_R的博客 2673
上一篇: Android内存优化之查看内存使用情况
下一篇: Android内存优化之内存泄漏的陋习
JosonChou
博客等级 码龄11年 8粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值