Android下常见的内存泄露 经典

Android常见内存泄露分析及MAT与Profiler内存分析时间 1.Java内存分配策略 Java程序运行时的内存分配策略有三种:静态分配、栈式分配和堆式分配。对应的存储区域如下: 静态存储区(方法区):主要存放静态数据、全局static数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。 栈区:方法体内的局部变量都在栈上创建,并在方法执行结束时这些局部变量所持有的内存都会自动被释放。 堆区:又称动态内存分配,通常就是指在程序运行时直接new出来的内存。这部分内存在不使用时将会由Java垃圾回收器来负责回收。 2.堆与栈的区别 栈内存: 阅读详情

转自:http://www.linuxidc.com/Linux/2011-10/44785.htm

因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题。

于是有时遇到程序运行时不断消耗内存,最终导致OutOfMemery,程序异常退出,这就是内存泄露导致的。

我们现在就来总结一下可能导致内存泄露的情况:

  1. 查询数据库而没有关闭Cursor

    在Android中,Cursor是很常用的一个对象,但在写代码是,经常会有人忘记调用close, 或者因为代码逻辑问题状况导致close未被调用。


    通常,在Activity中,我们可以调用startManagingCursor或直接使用managedQuery让Activity自动管理Cursor对象。
    但需要注意的是,当Activity介绍后,Cursor将不再可用!
    若操作Cursor的代码和UI不同步(如后台线程),那没需要先判断Activity是否已经结束,或者在调用OnDestroy前,先等待后台线程结束。

    除此之外,以下也是比较常见的Cursor不会被关闭的情况:

    1. try {  
    2.     Cursor c = queryCursor();  
    3.     int a = c.getInt(1);  
    4.     ......  
    5.     c.close();  
    6. } catch (Exception e) {  
    7. }  
    虽然表面看起来,Cursor.close()已经被调用,但若出现异常,将会跳过close(),从而导致内存泄露。

    所以,我们的代码应该以如下的方式编写:

    1. Cursor c = queryCursor();  
    2. try {      
    3.     int a = c.getInt(1);  
    4.     ......  
    5. } catch (Exception e) {  
    6. } finally {  
    7.     c.close(); //在finally中调用close(), 保证其一定会被调用   
    8. }  

  2. 调用registerReceiver后未调用unregisterReceiver().

    在调用registerReceiver后,若未调用unregisterReceiver,其所占的内存是相当大的。
    而我们经常可以看到类似于如下的代码:

    1. registerReceiver(new BroadcastReceiver() {  
    2.     ...  
    3. }, filter); ...  
    这是个很严重的错误,因为它会导致BroadcastReceiver不会被unregister而导致内存泄露。


  3. 未关闭InputStream/OutputStream

    在使用文件或者访问网络资源时,使用了InputStream/OutputStream也会导致内存泄露


  4. Bitmap使用后未调用recycle()

    根据SDK的描述,调用recycle并不是必须的。但在实际使用时,Bitmap占用的内存是很大的,所以当我们不再使用时,尽量调用recycle()以释放资源。


  5. Context泄露

    这是一个很隐晦的内存泄露的情况。
    先让我们看一下以下代码:
    1. private static Drawable sBackground;  
    2.   
    3. @Override  
    4. protected void onCreate(Bundle state) {  
    5.   super.onCreate(state);  
    6.     
    7.   TextView label = new TextView(this);  
    8.   label.setText("Leaks are bad");  
    9.     
    10.   if (sBackground == null) {  
    11.     sBackground = getDrawable(R.drawable.large_bitmap);  
    12.   }  
    13.   label.setBackgroundDrawable(sBackground);  
    14.     
    15.   setContentView(label);  
    16. }  

    在这段代码中,我们使用了一个static的Drawable对象。
    这通常发生在我们需要经常调用一个Drawable,而其加载又比较耗时,不希望每次加载Activity都去创建这个Drawable的情况。
    此时,使用static无疑是最快的代码编写方式,但是其也非常的糟糕。
    当一个Drawable被附加到View时,这个View会被设置为这个Drawable的callback (通过调用Drawable.setCallback()实现)。
    这就意味着,这个Drawable拥有一个TextView的引用,而TextView又拥有一个Activity的引用。
    这就会导致Activity在销毁后,内存不会被释放。

android加载大图片 android加载大图片oom是常遇到的问题,此资源加载前将图片进行缩放,按缩放比例加载缩放后的图片来解决oom问题。Gallery和ImageSwitcher配合展示图片 立即下载

相关推荐

网络调试和分析工具 Proxyman Premium

它支持MacOS、iOS和iPadOS等操作系统,提供丰富的功能,如查看和编辑HTTP/HTTPS请求和响应、设置断点、过滤请求等。Proxyman Premium还支持WebSocket、GraphQL和gRPC等现代网络协议调试,并通过直观且图形化的操作界面,使用户能高效地监控和操纵网络数据流。此外,它还具备多种高级功能,如WebSocket支持、DNS欺骗、自定义SSL证书等,为开发人员提供极大的便利。同时,由于软件版本更新和界面调整,上述步骤可能会有所变化,建议您参考最新版本的官方文档进行操作。

llhf688的博客 2001

Android下常见的内存泄露

因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题。 于是有时遇到程序运行时不断消耗内存,最终导致OutOfMemery,程序异常退出,这就是内存泄露导致的。 我们现在就来总结一下可能导致内存泄露的情况: 查询数据库而没有关闭

Alfred的贼窝 1003

WinCC与PLC在西门子逻辑赛项中的通信配置避坑指南

本文针对西门子逻辑赛项中WinCC与PLC通信配置的常见问题,提供了一套实战避坑指南。重点解析了WinCC、PLC与EET仿真平台的三角通信架构,强调了IP地址规划、防火墙设置等关键环节的注意事项,并给出了系统化的故障诊断流程与排查技巧,帮助选手和技术人员快速定位并解决通信故障,确保监控系统稳定运行。

weixin_29165725的博客 107

Android 性能优化总结

一、UI优化 1.布局优化 1.1 减少嵌套层级 ,页面比较简单时可以使用merge来减少层级,当页面层级很多时,可以考虑使用ConstraintLayout来减少层级嵌套; 1.2 当层级相同时,优先使用FrameLayout、LinerLayout其次时RelativeLayout,因为FrameLayout的渲染速度最快,其次是LinerLayout,然后是RelativeLayout; 1.3 布局复用,使用<include>标签重用layout; 1.4 提高显示速度,使用&

qq_36658567的博客 292

行业变革下的功能安全落地痛点3:高阶智驾安全责任转移 —— 从 “人为中心” 到 “机器主责” 的产业阵痛

文章围绕高阶智驾(L3 级)落地挑战,探讨安全责任从 “人控” 向 “机控” 转移的本质、技术短板导致的责任模糊、全球法规实践及技术 - 法规 - 保险的破局路径。

my9111526 126

基于物联网设计温室水培系统(NBIOT+华为云IOT)_338

本项目设计并实现了一套基于物联网的温室水培系统。系统以STM32F103RCT6单片机为核心控制器,结合SHT30温湿度传感器、SGP30二氧化碳传感器、BH1750光照传感器及液位检测传感器等硬件,实现对温室内环境参数的实时采集。系统支持自动和手动两种控制模式,能够根据传感器数据自动控制补光灯、通风风扇、遮光卷帘、降温水帘及营养液补充电机。通过NBIoT模块,系统可将采集的数据通过MQTT协议上传至华为云IOT平台,用户可通过Android手机APP或Windows上位机进行远程监控与控制。

413

[实践-内存优化] 解决 SVGAPlayer 内存问题的复盘总结

解决 SVGAPlayer 内存问题的复盘总结 本文是基于真实项目优化而来,具体代码已经贡献给组织。 SVGAPlayer-Android 这个库做的还是很实用的,但是存在着很严重的内存问题。为了提升项目的质量和稳定性,对其进行一些修改,并提交给组织。 修复工作整体分为两步: 修复内存泄漏问题。 修复运行时无用资源对内存的消耗。 修复内存泄漏问题 发现内存泄漏的问题过程比较简单,重点是如何发现。在这次解决问题主要步骤就是使用 MMAT 工具分析内存泄漏问题,然后定位分析,解决问题。 总的来说内存泄漏

大圣代的技术专栏 6208

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

perseverance51博客 5786

android内存泄露的原因

1、资源对象没有关闭造成内存泄露    资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄漏。因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我

xiongyanbing123123的专栏 795

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 202

DeepSeek+Cline:开启自动化编程新纪元

随着 AI 技术不断进步,编程领域迎来效率变革。DeepSeek 与 Cline 的结合,成为自动化编程的强大工具。DeepSeek 凭借先进的自然语言处理能力,能精准理解编程需求;Cline 作为 VSCode 插件,可实现代码生成、调试、注释等功能的无缝衔接。本文详细阐述二者安装配置、实战操作流程,涵盖从基础代码生成到复杂项目开发的应用技巧,同时解答常见问题,帮助开发者快速掌握这对 “智能搭档”,提升编程效率,解锁自动化编程的无限可能。

邓邓子的博客 6254

常用内存泄漏的解决

做Android开发中,我们一般都比较头疼的事内存泄漏问题,往往程序莫名其妙的就OOM了。有时我们会美其名曰手机差或者android系统就这样,用用都会奔溃。但是实际上我们可以通过平时的编码习惯来去尽可能的减少内存泄漏,同时也就可以减少OOM的出现。 下面我就说说我开发以来通常遇到的内存泄漏问题,以及怎么去解决它。

q5873998的专栏 365

IMSL CNL 7.0.0 (x86-64)Crack

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

Android中常见的内存泄露

Android中常见的内存泄露有以下几种:1.单例造成的内存泄露

喵喵喵喵喵? 342

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Devexpress16.2.6破解工具

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

java(Android)——内存泄露的一些经典案例

1、匿名内部类,非静态内部类造成的内存泄露隐患经典面试题:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnabl

wuseyukui的专栏 1443

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android常见内存泄露及优化方案

简介 如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回 收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,这中情况就是内存泄 露。在 Android 开发中,一些不好的编程习惯会导致我们的开发的 app 存在内存泄露的情况。下面介绍总结一些在 Android 开发中常见的内存泄露场景及优化方案。 单例导致内存泄露 单例模式在 Android...

浪克oo的博客 641

Android性能优化篇(二)——内存泄露

                      Android性能优化篇(二)——内存泄露 题记:中午和小伙伴聊了聊天,反思了这段时间自己的获与得,与更加明确了前进的方向,加油吧,小废废。 一、Android Profiler 1、功能介绍 2、实例分析 二、LeakCanary 1、使用 2、对比Andorid Profiler 三、常见的内存泄露问题 1、由于Context导致内...

大喵爱吃鱼的博客 1271

android 内存泄露 prop,安卓内存泄露怎么办 安卓内存泄露解决办法

升级到lollipop的android设备用户们有没有遇到后台应用被迫关闭、系统速度慢、经常重启等情况呢?其实这是内存泄露问题,今天脚本之家小编为大家分享安卓内存泄露解决办法,遇到朋友可以节操参考解决问题!绝大部分已经升级到lollipop的android设备都在遭遇一个问题—内存泄露,这是一个轻则后台应用经常被迫关闭、重则拖慢系统甚至导致重启的缺陷,即便是三星galaxy s6也未能幸免,好在针...

weixin_29128689的博客 205
上一篇: Android Menu
下一篇: android中finish()与system.exit(0)的区别?
i丹明扬
博客等级 码龄15年 331粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值