android内存泄露

Android待机问题与内存泄露日志定位及bugreport获取分析 安卓 bugreport 是 Android 系统生成的错误报告文件,它可以帮助开发者和技术支持人员诊断和解决系统或应用程序出现的问题。 1. 分析bugreport,定位唤醒源,判断是否有ANR。 2. 分析安卓log,定位待机唤醒功耗问题,判断是否有内存泄露。 阅读详情

1、android中的内存泄露

对于android中一些无用的对象,比如activity,view长期持有这些对象,导致无法被GC回收利用,再次使用的,重新申请内存。长久下去,应用程序无法分配新内存,导致OOM。
大部分内存泄露,不会直接导致程序崩溃,但长期下去,应用程序无法负担。一反面使用app耗用大量内存,卡顿,别一方面。最终还是可能导致OOM导常。

square比较好用的内存检测工具
https://github.com/square/leakcanary

2、android中常见的内存泄露地方

1、不合理的使用static静态变量。
2、不合理的使用单例。
3、handler引起的内存泄露。
4、查询数据库,对文件读写。未关闭资源(cursor没有关闭)。
5、不合理的监听(该对象已经移除,还对该对象进行监听)比如,内容观察者没有在适合的地方移除。
6、内部类的不适当使用。

这几个地方,在android开发的过程中,经常遇到。因此在这几个地方,要特别注意,防止发生内存泄露。

3、慎用static关键字

使用静态static静态变量潜在性问题:

1.占用内存,并且内存一般不会释放;

2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。

3.不能将activity作为static静态对象,这样使activity的所有组件对象都存入全局内存中,并且不会被回收;

1、静态集合引发内存泄露

在某些情况下可能需要静态集合做些缓存数据,但是。我们可能在每次使用的时候,给静态集合中添加了数据,但从没有移除过数据,导致集合中数据越来越多。因此使用静态集合的时候,一定记得在适合的情况下移除集合中的数据,防止内存泄露。

2、单例模式引起内存泄露

public class Singleton {
    private static Singleton singleton;
    private Context context;

    private Singleton(Context context) {
        this.context=context;

    }

    /**
     * 单例引起的内存泄露;
     * @param context
     * @return
     */
    public synchronized static Singleton getSingleton(Context context) {
        if (singleton == null) {
            singleton = new Singleton(context);
        }
        return singleton;
    }

}

这里写图片描述
由于单例拥持有了当前Activity对象,所以当前Activity没有办法回收,导致MainActivity内存泄露。
解决办法:把context换成application的context;

public class Singleton {
    private static Singleton singleton;
    private Context context;

    /**
     * 把生命周期更长的application的上下文传入
     *
     * @param context
     */
    private Singleton(Context context) {
        this.context = context.getApplicationContext();

    }

    /**
     * 单例引起的内存泄露;
     *
     * @param context
     * @return
     */
    public synchronized static Singleton getSingleton(Context context) {
        if (singleton == null) {
            singleton = new Singleton(context);
        }
        return singleton;
    }

}

3、Handler引起的内存泄露

这里写图片描述
android handler机制用于我们从子线程返回的数据后,刷新ui。但在一些情况下,后台仍然在执行耗时操作(网络请求,数据库查询等)时,当前activity已经销毁,被回收,而我们还在等待返回数据后ui刷新。当前的handler持有对activity的引用,因此,activity也没有办法销毁。

public class SecondActivity extends AppCompatActivity {

    private TextView textView;
    private MyHandler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        textView = (TextView) findViewById(R.id.text);
        mHandler=new MyHandler();
        Message message = new Message();
        message.arg1 = 1;
        mHandler.sendMessageDelayed(message, 5000);
        finish();

    }
    class MyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    textView.setText("123");
                    break;
            }
        }
    }
}

解决办法:

public class SecondActivity extends AppCompatActivity {

    private TextView textView;
    private MyHandler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        textView = (TextView) findViewById(R.id.text);
        mHandler=new MyHandler(this);
        Message message = new Message();
        message.arg1 = 1;
        mHandler.sendMessageDelayed(message, 5000);
        finish();

    }

    public void notifyView() {
        textView.setText("12");
    }

    private static class MyHandler extends Handler {
        private final WeakReference<SecondActivity> mActivity;

        public MyHandler(SecondActivity activity) {
            mActivity = new WeakReference<SecondActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            System.out.println(msg);
            if (mActivity.get() == null) {
                return;
            }
            mActivity.get().notifyView();
        }
    }
}

在Java 中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,静态的内部类不会持有外部类的引用。

android中的很多内存泄露都是由于在Activity中使用了非静态内部类导致的,我们在使用非静态内部类一定要格外注意,如果该静态内部类的实例对象的生命周期大于外部对象,那么就有可能导致内存泄露,推荐使用上面介绍的静态类和弱引用的方法解决这种问题。

4、LeakCanary内存泄露工具分析

leakcanary的确很大程度帮我们找出内存泄露的地方,方便的们及时排查内存泄露的代码。
leakcanary其实相当于把所有activity(Application)的生命周期回调放在一个集合中,这个集合存放activity回调,leakcanary对activity的onDestory方法进行检测。
Application的ActivityLifecycleCallbacks回调接口中的onDestory()回调实现对项目中的activity进行对象监听,然后交给RefWatcher监听类进行进一步处理。

LeakCanay的入口是在application的onCreate()方法中声明的,其实用的就是Application的ActivityLifecycleCallbacks回调接口监听所有activity的onDestory()的,在这个方法进行RefWatcher.watch对这个对象进行监控。

具体是这样做的,封装成带key的弱引用对象,然后GC看弱引用对象有没有回收,没有回收的话就怀疑是泄漏了,需要二次确认。然后生成HPROF文件,分析这个快照文件有没有存在带这个key值的泄漏对象,如果没有,那么没有泄漏,否则找出最短路径,打印给我们,我们就能够找到这个泄漏对象了。
参考博客
http://blog.youkuaiyun.com/cloud_huan/article/details/53081120

android 内存泄露 分析方法 android 内存泄露 分析方法.非常难对应的问题。首先弄明白原理 立即下载

相关推荐

微信小程序内容安全审核:从API调用到工程化落地的全流程实践

内容安全是互联网应用开发中的基础性技术环节,尤其在用户生成内容(UGC)场景下,它直接关系到平台的合规性与用户体验。其核心原理通常结合了关键词过滤、自然语言处理(NLP)和计算机视觉(CV)等技术,通过AI模型对文本、图像、音频进行多维度风险识别。这项技术的价值在于,它不仅是满足监管要求的必要手段,更是构建健康社区生态、保护品牌声誉、实现产品长期稳定运营的基石,广泛应用于社交、电商、社区论坛等各类UGC平台。本文聚焦于微信小程序生态,深入剖析其官方提供的内容安全解决方案,详细解读如何将文本同步检测与多媒体异

weixin_28622215的博客 452

Android 内存泄露分析

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

hello_1995的博客 4965

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 512

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

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

weixin_34310785的博客 679

用Simulink复现Hopf振荡器:从数学公式到稳定极限环的保姆级仿真教程

本文详细介绍了如何在Simulink中实现Hopf振荡器,从数学原理到仿真建模的全过程。通过参数调试和波形分析,帮助读者掌握Hopf振荡器的核心特性及其在机器人控制等领域的应用。特别强调了自适应调节技巧,提升系统稳定性和鲁棒性。

weixin_29261711的博客 444

用Simulink对Carsim车辆进行档位控制

用Simulink对Carsim车辆进行档位控制一、carsim中的档位设置为开环控制二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear三、双击进去设置常量为 0四、输入和输出IO通道五、验证 :输入 为 3 档 ----- 输出 为 3!六、参考 一、carsim中的档位设置为开环控制 二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear 三、双击进去设置常量为 0 四、输入和输出IO通道 五、验证 :输入 为 3 档 -

qq_42027654的博客 2602

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

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

特立独行的博客 5869

I2C通信——时序图

本文用逻辑分析仪抓取主机I2C通信的时序图,抓取的过程是读某个寄存器的值。

weixin_43772611的博客 7355

内存泄漏的场景

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

wanghong940821的博客 5113

开源GIS -- 笔记

基础开发库 数据读写:GDAL/OGR(C/C++) ArcGIS和GE都是使用此工具 投影转换:Proj.4(C/C++) 拓扑计算:JTS(Java),GEOS(C++),Shapely(python) 组件式开发库 GeoTools(Java),DotSpatial(.NET) 空间分析: Scipy(通用科学计算、方程求解), numpy,NextworkX, rPy(统计分析), Scikit-learn,pysal(空间分析) 深度学习: Keras、 tensorflow、 pytor

DZ Space 4521

【华为OD机试】创建二叉树(python, java, c++, js)

请按下列描达构建一颗二叉树,并返回该树的根节点: 1、先创建值为-1的根结点,根节点在第0层; 2、然后根据operations依次添加节点: operations[i] = [height, index] 表示对第 height 层的第index 个节点node, 添加值为i 的子节点: 若node 无「左子节点」。则添加左子节点; 若node 有「左子节点」但无「右子节点」,则添加右子节点: 否则不作任何处理。 height、index 均从0开始计数;index 指所在层的创建顺序。

A_D_I_D_A_S的博客 188

Android的内存泄漏分析

内存溢出: 指程序在申请内存时,没有足够的内存空间供其使用,出现out of memoryAndroid系统为每个应用程序申请到的内存有限,一般为64M或者128M等,我们可以在清单文件中进行配置,android:largeheap = "true" 从而给APP申请更大的内存空间;给APP申请更大的内存空间。 内存溢出又分为 : 堆内存溢出, 栈内溢出。 虚拟机: JVM的作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。Dalvik和Art就是安卓中使用的虚拟机。项目

积小步而至千里 2098

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

weixin_29128689的博客 205

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

安卓内存泄露之DMA-BUF异常增长:Android Studio镜像引起DMA内存泄露

今天用着安卓 14 的板子的时候突然系统卡死。查看日志发现launcher都被干掉了看发现DMA-BUF占了3G多(4G设备),应用free ram基本没了。刚开始以为是scrcpy的问题。后来经调查发现是android studio的屏幕镜像问题。

Wesley的博客 1726

STM32F407中文手册

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

Android :安卓学习笔记之事件内存泄露 的简单理解

Android 内存泄露的简单理解内存泄露1、简介2、内存泄露的本质原因3、Android 内存管理机制3.1、针对进程的内存策略3.1.1、内存分配策略3.1.2、内存回收策略3.2、针对对象、变量的内存策略3.2.1、内存分配策略3.2.2、内存释放策略3.2.1、内存分配策略4、常见的内存泄露原因 & 解决方案4.1、集合类4.2、Static 关键字修饰的成员变量4.2.1、静态成员变量有个非常典型的例子 = 单例模式4.3、非静态内部类 / 匿名类4.3.1、非静态内部类的实例 = 静态4

JMW1407的博客 366

android手机存储速度慢,安卓内存泄露后台应用被迫关闭、系统速度慢的解决方法...

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

weixin_28733777的博客 177

Android内存泄露排查

Android内存泄露排查:使用conv-hprof转化生成的mat,然后在histogrm页面中过滤,选择incomming reference,然后去掉非强引用项目。

army的专栏 1536

Android 内存泄露总结

Android 内存泄露总结 简单的讲就是,该被释放的对象没有被释放,一直被某个或某些实例所持有却不再被使用导致GC不能回收。 JAVA 内存分配策略 Java程序运行时的内存分配策略有3种: - 静态分配 - 栈式分配 - 堆式分配 三种存储策略使用的内存空间分别是: 静态存储区 主要存放静态数据、全局static数据、常量,这块内存在程序编译时就已分配好,并且...

glen1943的专栏 447

android 内存泄露分析方法,Android内存泄露的分析方法

前言内存泄露,这个耳熟能详的一个bug,每次我在项目中遇到这种问题都非常的头疼,不像普通的异常奔溃比如JE什么的,只要通过Log中的异常堆栈就可以轻松的定位出问题点。那么到底什么是内存泄漏呢?简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收。导致这种情况原因是生命周期长的对象持有了生命周期短的对象导致的生命周期短的对象无法被回收。要想定位出内存泄...

weixin_39667452的博客 287

Android的内存泄露测试

Android下,如何进行内存泄露的测试,除了长时间运行的间接测试,有没有工具帮助我们进行这方面测试呢? 首先,安装 MAT 和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装 Eclipse IDE 环境,MAT 作为一个独立的 Eclipse RCP 应用运行;另一种是”集成版“的,也就是说 MAT 也可以作为 Eclipse IDE 的一部分,和

Amy0428的专栏 4040

Android 性能优化:手把手带你全面了解内存泄露,安卓ndk开发书籍

// 通过 循环申请Object 对象 & 将申请的对象逐个放入到集合List List objectList = new ArrayList<>(); for (int i = 0; i < 10; i++) { Object o = new Object(); objectList.add(o); o = null; } // 虽释放了集合元素引用的本身:o=null) // 但集合List 仍然引用该对象,故垃圾回收器GC 依然不可回收该对象 解决方案 集合类 添加集合元素

m0_66155412的博客 243

Android 中 Handler 引起的内存泄露

在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。通常我们的代码会这样实现。 public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message...

yanglin10000的博客 318

leaks Android内存泄露,Android内存泄露检测LeakCanary的使用

一、前言:官网地址:https://square.github.io/leakcanary/getting_started/目前为止最新的版本是2.6版本,相比于2.0之前的版本,2.0之后的版本在使用上简洁了很多,只需要在dependencies中加入LeakCanary的依赖即可。而且debugImplementation只在debug模式下有效,所以不用担心用户在正式环境下也会出现LeakC...

weixin_31232021的博客 1334

如何防止Android内存泄露

https://blog.youkuaiyun.com/unicorn97/article/details/81009204

ylq240911的博客 484

android内存泄露怎么办,Android内存泄露的解决之道

面试的时候经常会被问道内存泄露优化,和碰到OOM该怎么出来,今天就做个总结。为什么会内存泄露?根本原因就是一个永远不会被使用的对象,因为一些引用没有断开,没有满足GC条件,导致不会被回收,这就造成了内存泄露。比如在Activity中注册了一个广播接收器,但是在页面关闭的时候没有进行unRegister,就会出现内存溢出的现象。如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了...

weixin_36368404的博客 235
上一篇: android事件分发和案例
下一篇: Android NDK(1、简单入门和遇到的问题)
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值