Java中内存问题之OOM 和SOF

    OOM:OutOfMemoryError异常

    即内存溢出,是指程序在申请内存时,没有足够的空间供其使用,出现了Out Of Memory,也就是要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

    内存溢出分为上溢和下溢,比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢

    

    有时候内存泄露会导致内存溢出,所谓内存泄露(memory leak),是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,举个例子,就是说系统的篮子(内存)是有限的,而你申请了一个篮子,拿到之后没有归还(忘记还了或是丢了),于是造成一次内存泄漏。在你需要用篮子的时候,又去申请,如此反复,最终系统的篮子无法满足你的需求,最终会由内存泄漏造成内存溢出。

 

    遇到的OOM:

    (1)Java Heap 溢出

    Java堆用于存储对象实例,我们只要不断的创建对象,而又没有及时回收这些对象(即内存泄漏),就会在对象数量达到最大堆容量限制后产生内存溢出异常。

    (2)方法区溢出

   方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。

异常信息:java.lang.OutOfMemoryError:PermGen space

方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻的。在经常动态生成大量Class的应用中,要特别注意这点。

 

SOF:StackOverflow(堆栈溢出)

    当应用程序递归太深而发生堆栈溢出时,抛出该错误。因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

    栈溢出的原因:

    (1)递归调用

    (2)大量循环或死循环

    (3)全局变量是否过多

    (4)数组、List、Map数据过大

 

OOM在Android开发中出现比较多:

   场景有: 加载的图片太多或图片过大时、分配特大的数组、内存相应资源过多没有来不及释放等。

 

解决方法:

    (1)在内存引用上做处理

        软引用是主要用于内存敏感的高速缓存。在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内存溢出。什么时候会被收集取决于gc的算法和gc运行时可用内存的大小。

    (2)对图片做边界压缩,配合软引用使用

    (3)显示的调用GC来回收内存,如:

        if(bitmapObject.isRecycled()==false//如果没有回收  

       bitmapObject.recycle();

  (4)优化Dalvik虚拟机的堆内存分配

            》增强程序堆内存的处理效率    

        //在程序onCreate时就可以调用 即可

        privatefinalstaticfloat TARGET_HEAP_UTILIZATION = 0.75f; 

        VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

 

            》设置堆内存的大小

            privatefinalstaticintCWJ_HEAP_SIZE = 610241024;

      //设置最小heap内存为6MB大小

      VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);

 

    (5)用LruCache 和 AsyncTask<>解决

        从cache中去取Bitmap,如果取到Bitmap,就直接把这个Bitmap设置到ImageView上面。
  如果缓存中不存在,那么启动一个task去加载(可能从文件来,也可能从网络)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值