Android内存优化之内存泄漏的陋习

Cocos2d-x进阶实战:模块化设计、性能优化与跨平台开发全解析 在游戏开发领域,模块化设计与性能优化是构建高质量、可维护项目的核心工程实践。其原理在于通过合理的代码组织与资源管理,提升渲染效率、减少内存占用,并确保逻辑清晰。对于使用Cocos2d-x等跨平台引擎的开发者而言,掌握这些技术能显著提升开发效率与游戏表现。具体到Cocos2d-x项目,这涉及UI系统的动态列表与触摸事件处理、动画系统的组合与序列控制、以及资源异步加载与本地存储加密等关键场景。例如,通过纹理图集与自动批处理优化Draw Call,或利用引用计数机制避免内存泄漏,都是提升性能的典型手段。本文聚焦于 阅读详情

Android内存优化之内存泄漏的陋习

上篇写到内存泄漏的一些概念https://blog.youkuaiyun.com/Joson_Chou/article/details/83750514,说到内存泄漏的一些分析性的原因,这篇要说下具体的内存泄漏案例,在我们开发Android时很多人douh都会犯错的例子,特别是对于新手。

主要案例如下:

(1)BroadcastReciver在使用代码方式注册时,宿主(Activity、Fragment、Service等)退出时忘记反注册;

(2)单例模式下对象的释放问题;

(3)使用Handler产生的内存泄漏;

(4)线程的内存泄漏;

(5)数据库游标忘记关闭问题;

(6)构造Adapter时不习惯使用缓存的convertView;

(7)使用完Bitmap时没有调用recycle()方法区释放资源;

(8)WebView造成的内存泄漏;

(9)内部类持有外部类对象造成内存泄漏;

(10)第三方SDK内部内存泄漏;

 

BroadcastReciver内存泄漏

BroadcastRevicer广播接收器分两种注册方式,一种是通过AndroidManifest.xml静态方式注册,这类造成内存泄漏的方式比较hanj罕见,至少小编到现在也没遇到过;还有一种注册方式就是代码动态注册

registerReceiver(BroadcastRevicer,IntenFilter),大部分接触andrAndroid开发的人都会写广播,但是很多粗心人没注意到在使用完BroadcastReviver时进行fa反注册unregisterReceiver(BroadcastReciver);

此类型可延伸到一些常用的第三方开源框架,比如注解框架Butterknife使用完后要进行unbind、EventBus在退出时要进行unregister()操作。

 

单例对象内存泄漏

我们使用单例对象经常要传入一个Context对象,比如我们经常会用单例封装一个数据库操作类,这样方便我们不用频繁的创建对象,减少资源开销,由于单例的静态特性使得其生命周期和应用的生命周期一样长(JVM加载类的顺序,可参看此篇文章http://www.importnew.com/25295.html),所以在传入Context时如无特殊需求,可传入Application的context,直接调用context.getApplicationContext()进行传入。

 

Handler造成的内存泄漏

使用Handler我们再熟悉不过了,通过发送message来达到消息之间的传递,但是在使用Handler时我们需要在应用退出时需要手动进行消息队列MessageQueue清空,

 

mHandler.removeCallbacksAndMessages(null);

第二点就是我们在使用handler发送message对象,message对象强烈建议使用mHandler.obtainmessage()或者Message.obtain()方法来构造纤细对象,这样的方式好处就好在可以Message对象复用,通过在消息池里返回一个Message对象,避免重复new一个message对象造成资源浪费和内存消耗。

Handler内存泄漏就可能注意的比较少,先看一段代码:

在test()方法里我们希望能够将obj对象实例的操作放到post的某个线程的MessageQueue中,但是在上述所xi写的代码当中即使Handler所在的线程用完了obj对象了,但这个对象依然不会被GCqing清除,因为外部的Activityyi一直保持着这个对象的引用,在Java中,非静态内部类和匿名类内部类会隐式持有waib外部类对象的引用,这一点比较重要,相反静态内部类就不会存在引用外部类对象的情况,在解决这类问题时,我们可以以下这样的改进:

或者在不使用handler时进行手动置空 mHandler = null;

 

线程的内部泄漏

刚刚说到了匿名内部类会隐式持有外部类对象的引用,我们启动线程一般分以下方法:

(1)集成Thread类,实现run()方法;

(2)实现Runnable对象;

(3)集成AsyncTask,在doInBackGround()做耗时操作;

AsyncTask和Runnable都使用了匿名内部类,他们都将持有外部类对象的隐式引用,当我们activity退出时,如果我们的线程方法还没执行完,那么activity的内存资源将无法被GC回收,最直接的方法就是在退出时手动将线程关闭或者置为静态类型。

 

资源未关闭导致内存泄漏

上面提到了广播接收器未正确的反注册,与这类内存泄漏类型基本一致,都是未正确的使用API造成资源得不到回收,我们在使用数据库操作对象Cursor时,经常会忘记查询完后忘记关闭游标,正确使用如下面代码所示:

我们查询数据库数据时需在用完cursor对象时在finally模块里进行先cursor判空,为什么需要先判空,因为在查询数据时数据库可能不存在数据,直接返回一个null给cursor对象,在不为空时进行cursor.close();

在使用Bitmap时,我们需要注意的是Bitmap本身在内存中非常占内存,当Bitmap对象一多,会导致内存紧张,造成我们的Android系统异常卡顿,所以在使用完Bitmap对象需要手动释放资源bitmap.recycle();

使用WebView时我们需要在确认不再使用时将WebView进行destory(),避免占用内存;

构造Adapter未使用缓存convertView

我们以前经常会使用ListView(RecyclerView未出现时),通过传入一个Adapter来显示我们的数据,通过继承BaseAdapter来构造我们的Adapter,ListView会xian显示一定数量的item,当我们手指向上滑动ListView时,位于ListView的顶部item对象会被回收,然后被用来构造新出现的最下面的item对象,通过getView()方法完成,如果没有convertView,那么在给getView()时都会重新new一个item对象出来,这样会造成资源的浪费与内存开销,所以在使用Adapter时需要去缓存convertView。

 

第三方SDK内部泄漏

我们要完成一个成熟的APP,抛不开使用一些简单快捷的第三方库,比如EventBus等,但在使用的过程中我们偶尔会遇到一些作者都没察觉的bug,比如内存泄漏,而SDK内部又没有提供反注册或者让我们手动置空对象的方法,外部加上SDK的版本更新不上或者更新速度慢,我们就不得不fa发大招了:反编译或者反射置空;

(1)反编译:这种方法成功的几率比较少,但是可以让我们去接触Android内部究竟是怎么运行的,编译的时候Android都做了哪些操作,随便某度一搜,一大堆如何反编译的,我就随便扒个链接吧https://www.cnblogs.com/mfrbuaa/p/4588057.html

通过反编译得到源码,更改源码进行打包成一个jar包让我们的应用使用,从而达到解决内存泄漏的问题,小编以前试着用这种方法,内存泄漏确实也解决了,直接往源码里加反注册的方法,但是反编译会造成一些功能上不适配的功能,然后我又重新找了个方法,那就是反射。

(2)反射:反射获取对象进行置空,虽然会带来性能上的损耗,但大大增加了我们coding的能力,现在很多开源库之所以能做到这么灵活,其中一部分多亏与反射技术,反射也可在某度上一搜就一大堆,我就随便扒个链接吧https://www.cnblogs.com/wumingchen/p/5781844.html

 

以下是我解决SDK内部内存泄漏写的代码,只需要几行代码,就可以把对象置空O(∩_∩)O哈哈~

 

结语

内存泄漏有很多情况,我没有依依列出来,但是万变不离其中,要解决内存泄漏,就先知道内存泄漏的原因,知道内存到达是怎么被回收的,然后一步一个脚印,同时大家可以在楼下指出我写的哪些不对,欢迎大家拍砖点赞收藏分享。

C++高级特性实战:RAII、移动语义与并发编程深度解析 在C++编程中,资源管理和性能优化是构建健壮、高效软件系统的核心挑战。RAII(资源获取即初始化)作为一种关键编程范式,通过将资源生命周期与对象绑定,从根本上解决了内存泄漏、文件句柄未关闭等问题,其设计哲学体现了C++对确定性和安全性的追求。移动语义和完美转发等现代C++特性,则通过减少不必要的拷贝、支持高效资源转移,显著提升了程序性能,尤其在容器操作和泛型编程中价值凸显。这些高级特性与类型萃取、异常安全保证等技术结合,能够有效应对大型项目中的复杂架构设计。在实际应用场景中,从智能指针的自定义封装到并发编程 阅读详情

相关推荐

NLP争议识别:从立场建模到语义对抗的实战方法

争议识别是自然语言处理在内容安全与社区治理中的关键落地场景,其本质并非情感强度判断或主题聚类,而是建模观点空间中的结构性对立关系。技术上需突破单句分类范式,转向句子对建模与锚点驱动的立场判别,核心依赖立场建模和语义对抗挖掘能力。该技术显著提升UGC中分歧焦点、群体极化与价值观冲突的发现效率,广泛应用于电商评论审核、知识社区立场预警、教育内容价值观筛查等真实业务流。相比通用情感分析,它更强调可解释性、低延迟与业务嵌入性,尤其适合需人工复核、法务审计与实时响应的内容运营与品牌公关场景。

cuikuangru5755的博客 516

android 常见的内存问题

在面试中,经常会被问到内存优化或者内存泄漏的相关概念,这些老生常谈的问题,你是真的懂了吗? 笔者今天就想要彻底搞明白这些,还清当初欠下的技术债。 内存泄漏问题: 定义:当你不再需要某个实例后,但是这个对象却仍然被引用,防止被垃圾回收(Prevent from being bargage collected)。这个情况就叫做内存泄露(Memory Leak)。 常见的场景: 非静态内部类,...

sjh_389510506的博客 333

【电机控制入门】——电机控制书籍推荐

电机控制入门书籍推荐及分享 阅读须知: 1.电机控制的入门是涉及到机械、电子与控制等复杂交叉学习,它需要持续投入时间才可以看到学习的效果,如同“一万小时定律”。俗话说,九层之台,起于垒土,因此电机控制入门没有所谓的速成培训班。相反,还需要夯实好一定的基础。为此,博主建议从基础理论抓起,故推荐相关的书籍并分享给大家。 2.学习电机贵在动手实践,无论是借助于MATLAB/Simulink仿真平台来验证理论分析,或是使用板子对所设计的控制系统进行物理实现,博主极力推荐在一定基础(看完部分以下推荐的书籍),一边动手

昔时扬尘处 3万+

Android 内存泄漏

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

追梦的鱼儿 2980

关于VS2019调试问题:进程已退出,代码为-1073741819(已解决)

关于VS2019调试问题:进程已退出,代码为-1073741819(已解决) 详情:上一篇发了这个进程问题,在我翻阅了《c语言程序设计第四版》和《算法与数据结构》两本书对照代码加上调试终于找到了解决方法 解决方法: 首先找到项目的源文件右击找到属性 然后选择从生成中排除选择是! 重新生成解决方案,发现代码问题: 之前的代码: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include &lt

qq_51553982的博客 1万+

win11系统ping另一台电脑上VMware虚拟机的IP

我是用了两台电脑,所以刚才遇到一个问题就是两台电脑的IP 在同一局域网内ping不通。于是就找了很多资料,经过坚强的绝望后终于解决了。 下开始解决问题: VMWare提供了三种工作模式:bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。 1. bridged(桥接模式)   在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立主机,它可以访问网内任何一台机器。在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚

qq_42817360的博客 3236

Android:最全面&详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)

前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情。真正的大师永远怀有一颗学徒的心。 一、概述 在Android中,性能优化非常重要,因为这决定这一个APP的质量好坏,一个更快更稳更省的app能给用户更优秀的体验。 更快:App流畅不卡顿,快速响应; 更稳:App稳定运行,程序不崩溃(Crash)和无响应(ANR); 更省:节省资...

https://juejin.cn/user/1654096907477549/posts 1万+

Immich vs Nextcloud照片管理实测:自建私有云相册到底选哪个?

本文深度评测了Immich与Nextcloud在私有云相册管理中的表现,涵盖核心功能、性能基准、本土化实践及进阶功能。Immich凭借微服务架构和AI优化在照片管理、移动端体验上表现优异,而Nextcloud则强在生态整合。文章还提供了Docker部署优化和国内网络适配方案,帮助用户根据需求选择最佳方案。

seed的博客 324

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

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

qq_33556350的博客 1万+

【ComfyUI】FluxKontext 人物服装平铺重构

本文介绍了一个基于ComfyUI的高保真服装语义提取工作流,利用FluxKontext模型实现人物服装结构的精准抽离与平铺展示。工作流包含图像输入、潜空间处理、语义引导和生成输出四个阶段,通过Flux_Kontext_dev_fp8主模型、双CLIP文本编码和VAE转换等核心组件,配合FluxKontextImageScale、ReferenceLatent等节点完成服装结构的稳定提取。流程中CLIPTextEncode负责语义解析,FluxGuidance强化引导力度,KSampler执行最终生成,最终输

Mr数据杨 955

第38节:cesium 风场效果(含源码+视频)

cesium 风场效果

qq_29384639的博客 2329

深入探索 Android 内存优化(炼狱级别)

前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 本篇是 Android 内存优化的进阶篇,难度可以说达到了炼狱级别,建议对内存优化不是非常熟悉的仔细看看前篇文章:Android性能优化之内存优化,其中详细分析了以下几大模块: 1)、Android的内存管理机制 2)、优化内存的意义 3)、避免内存泄漏 4)、优化内存空间 5)、图片管理模块的设计与实现 如果你对以上基础内容都比较了解了,那么我们便开始 Android 内...

idaretobe的专栏 4147

Unity之如何实现TTS文本转语音(真人发音)

微软Azure TTS 文本转语音 服务 将文本转换为逼真的语音的语音服务功能 支持个各国语言,各种中文各种方言,支持不同音色男音女音 支持离线和在线版本

TxNet 5478

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

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

maniuT的博客 3241

机器人轨迹规划——梯形速度轨迹(超详细)

机器人轨迹 这一系列轨迹教程将主要包括以下内容: 点到点轨迹(P2P) 五次多项式插值轨迹 三次多项式插值轨迹 梯形速度曲线轨迹 双S形速度曲线轨迹 多个自由度轨迹的时间同步 在线轨迹规划 多项式在线轨迹规划 梯形在线轨迹规划 双S形在线轨迹规划 非线性实时轨迹滤波 多点轨迹(Multi-point) 三次样条曲线(cubic spline) 贝赛尔曲线(Bezier Curve) B样条曲线(BSpline) 时间最优轨迹 三次样条时间最优轨迹 任意路径下的时间最优轨迹 时间

出门搔白首,若负平生志 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android内存泄漏

1 什么是内存泄漏(Memory Leak) leak [liːk] 渗入,漏出;漏,渗漏;泄露,透露 Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩溃,同时防止未释放的内存把堆栈(Heap)挤爆的可能,所以写出来的代码更为安全。 segmentation [ˌseɡmenˈteɪʃn] 分割;割断;细胞分裂 但是,在Java中仍存在很多容易导致内存泄漏的逻辑可能(logical leak)。如果不小心,Android应

xingyu19911016的博客 4525

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android 内存优化

一、重识内存优化 Android给每个应用进程分配的内存都是非常有限的,那么,为什么不能把图片下载下来都放到磁盘中呢?那是因为放在 内存 中,展示会更 “快”,快的原因有两点,如下所示: 1)、硬件快:内存本身读取、存入速度快。 2)、复用快:解码成果有效保存,复用时,直接使用解码后对象,而不是再做一次图像解码。 这里说一下解码的概念。Android系统要在屏幕上展示图片的时候只认 “像素缓冲”,而这也是大多数操作系统的特征。而我们 常见的jpg,png等图片格式,都是把 “像素缓冲” 使用不同的手段

十年代码写十年 2743

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 内存泄漏的常见原因及其对应的解决方案

LeakCanary由Square开发,是一个强大的开源库,用于检测Android应用程序中的内存泄漏。内存泄漏是指在应用程序中不再需要的对象仍然保持对内存的引用,导致内存无法回收,从而造成内存溢出和性能问题。LeakCanary可以自动检测和报告应用程序中的内存泄漏,并提供详细的信息,帮助开发人员快速定位和修复问题。

特立独行的博客 5869

Android内存优化的10条建议

合理设置应用的minSdkVersion和targetSdkVersion,使应用可以运行在更多设备上,这可以提高内存利用效率。 避免在Application和Activity的onCreate方法中做过多工作,这会占用过多内存。可以将不必要的初始化工作放到onStart或延迟加载。 避免在UI线程中进行过多工作,可以使用AsyncTask或者Thread执行耗时操作,避免ANR问题发生。 重用已有对象,避免重复创建对象,这会产生大量垃圾对象,增加GC负担。可以使用对象池技术重用对象。 优化布局,减少视图

wayne214的博客 1061

Android 性能优化:手把手带你全面了解内存泄露

前言 在Android中,内存泄露的现象十分常见;而内存泄露导致的后果会使得应用Crash 本文 全面介绍了内存泄露的本质、原因 &amp; 解决方案,最终提供一些常见的内存泄露分析工具,希望你们会喜欢。 目录 1. 简介 即 ML (Memory Leak) 指 程序在申请内存后,当该内存不需再使用 但 却无法被释放 &amp; 归还给 程序的现象 2. 对应用程序的影响 ...

weixin_34310785的博客 679

Android 内存泄露分析

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

hello_1995的博客 4964

内存泄漏的场景

内存泄漏问题可以说是Android开发者最烦恼的问题之一了,项目中连续遇到几个内存泄漏问题,这篇文章主要说明下容易发生内存泄漏的场景以及检查分析内存泄漏的一些工具与方法。一、什么是内存泄漏在说内存泄露之前,需要先了解JVM的内存回收机制。1.JVM的内存回收机制大家都知道,Java是有垃圾回收机制的,这使得java程序员比C++程序员轻松了许多,存储申请了,不用心心念念要加一句释放,java虚拟机...

wanghong940821的博客 5112

Android 性能优化--内存优化分析总结

强大的Java Heap分析工具,查找内存泄漏及内存占用生成整体报告、分析问题等线下深入使用官网下载地址:www.eclipse.org/mat/downloa… ,这个地址是不是有你熟悉的单词,嗯,没错啦,MAT是Eclipse中的一个插件,因为现在开发过程中很多人都使用了IDEA或者Android Studio,所以你不想下载Eclipse的话呢,你可以去下载MAT的独立版,解压之后里面有一个MemoryAnalyzer.exe的可执行文件,直接点击就可以使用了。

缘来的精彩的博客 2220

Android性能优化大法——内存优化

内存,是Android应用的生命线,一旦在内存上出现问题,轻者内存泄漏,重者直接crash,因此一个应用保持健壮,内存这块的工作是持久战,而且从写代码这块就需要注意合理性,所以想要了解内存优化如何去做,要先从基础知识开始。

maniuT的博客 1380

Android 优化 - 内存

系统对每个 APP 都有一定的内存限制(设备出厂以后 JAVA 虚拟机对单个 APP 的最大内存分配就确定下来了,位于 /system/build.prop 文件中的 dalvik.vm.heap growth limit),当应用程序使用的内存超过了上限就会出现 OOM (Out of Memory),也就是异常退出。一些会频繁执行的方法例如 onDraw(),每次创建局部变量时内存都会分配给它,但在循环结束后它们不会被立即回收,这将导致内存的不断增加,最终导致内存抖动。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值