Android中的内存泄漏和内存溢出

一、内存溢出和内存泄漏的概念理解

**内存溢出:**是指程序代码片段被执行申请内存时,没有足够的内存空间,导致OOM异常。

OOM:即内存溢出,out of momery。

Android系统为每一个应用程序申请的内存是有限的(为什么如此设计,在dalvik虚拟机章节已经说明),一般为64M或者128M等,国内手机产商修改rom后,也会有所不同。

我们可以在清单文件中配置android:largeheap=“true”,从而可给app申请更大的手机内存空间。

**内存泄漏:**内存泄漏是指程序在申请内存后,被某个对象一直持有而无法释放已申请的内存空间。内存泄漏不断堆积,应用程序可申请的内存空间就会越来越少,最终可能就出现,当程序片段被执行申请新的内存空间而不得,最终导致内存溢出。

内存泄漏是因,内存溢出是果。针对于内存溢出,除了手机内存小,应用程序本身申请的大对象内存多(比如没有合理的处理bitmap),内存泄漏是导致内存溢出的一个重要的原因。

故,在做我们的应用程序的内存优化的时候,内存溢出排查也是其中的一个重要方面。

二、内存溢出分类

1、栈内存溢出

栈内存溢出:StackOverflowError,方法被运行在虚拟栈中,在虚拟栈中的执行的命令递归执行,如果递归的深度过大,则可能会导致栈溢出。通过一下case,可以模拟栈内存溢出。

public class StackOverflowCase {
   

    //模拟一个递归方法调用
    public void stackOverflowMethod(){
   
        stackOverflowMethod();
    }

    public static void main(String[] args) {
   
        StackOverflowCase stackOverflowCase = new StackOverflowCase();
        stackOverflowCase.stackOverflowMethod();
    }
    
    //main函数运行后,会抛出Exception in thread "main" java.lang.StackOverflowError
}
2、堆内存溢出

堆内存溢出:OutOfMemoeryError,Java中被创建的对象实例,所占用的内存空间过大,超出了当前应用进程能获取的最大内存空间。

堆内存溢出,是非常常见的,日常开发当中,有很多案例可能导致堆内存溢出,在第三节中会对堆内存泄漏的案例做详细分析。内存泄漏终将导致内存溢出。除了内存泄漏之外,常见的内存溢出场景有:

1)类结构没有声明好,导致的内存溢出,比如fastJson解析json串的时候,出现了对象之间的相互引用。

2)对象所申请的内存过大,比如在android应用开发中,经常会用到的大图加载,bitmap的对象占用大量内存,所以,我们有各种三方图片加载库,大多通过缓存算法,解决图像占用过大的内存。

3)内存泄漏,并不会理解导致我们的应用程序瘫痪,但是溢出的持续积累,终将导致内存溢出。

3、持久代内存溢出

持久代中包含方法区,方法区中包含常量池,持久代内存溢出包括:

1)运行时的常量池溢出 2)方法区中保存的class对象没有及时被回收掉或者class信息占用的内存过大导致溢出。用String.intern()可以触发常量池溢出。

三、内存泄漏的场景案例

1、单例模式下的内存溢出

代码案例:

class AppSetting {
   
    private static  AppSetting ourInstance = null;
    public static Context mContext;

    static AppSetting getInstance(Context context) {
   
        if(ourInstance!=null){
   
    
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android开发内存溢出是指应用程序在申请的内存超过了系统可用内存的情况。这可能导致应用程序崩溃、运行缓慢或者被系统强制关闭。以下是一些常见导致内存溢出的情况和解决方法: 1. Bitmap内存溢出:在使用Bitmap处理图片时,如果没有正确地释放Bitmap对象,或者加载了过大的图片导致占用大量内存,就发生内存溢出。解决方法包括使用合适的图片加载库(如Glide、Picasso),及时释放不再使用的Bitmap对象,或者对图片进行压缩处理。 2. 长时间占用内存的后台任务:如果应用程序存在长时间运行的后台任务,而且这些任务没有及时释放占用的内存,就可能导致内存溢出。解决方法是在合适的时机停止或取消后台任务,并释放相关资源。 3. 内存泄漏内存泄漏问题在上一个问题已经提到过。如果应用程序存在内存泄漏,持续占用内存而不释放,就导致内存溢出。解决方法是检查代码,及时释放不再使用的对象引用,避免长时间持有上下文或其他对象的引用。 4. 大量对象的创建和销毁:如果应用程序频繁地创建和销毁大量对象,而没有及时释放,就导致内存溢出。解决方法包括使用对象池或缓存来重复利用对象,减少对象的创建和销毁次数。 5. 不适当的资源使用:如果应用程序使用了大量的资源,如文件、数据库连接等,而没有正确地关闭或释放这些资源,就导致内存溢出。解决方法是在不再需要使用资源的地方及时关闭或释放资源。 6. 大数据集的处理:如果应用程序需要处理大量的数据集,而没有进行分页或分批加载,就可能导致内存溢出。解决方法是采用分页加载或分批处理的方式,减少一次性加载大量数据的压力。 总之,要避免Android应用程序内存溢出问题,开发者应该注意及时释放占用的内存,避免内存泄漏和不适当的资源使用。合理管理Bitmap对象、后台任务、对象的创建和销毁,以及大数据集的处理都是预防内存溢出的重要方法。此外,使用工具进行内存分析和优化也是提高应用程序性能的有效方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hymKing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值