java处理OOM和SOF

一、OOM

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

  内存泄露会导致内存溢出,所谓内存泄露(memory leak),是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光

(1)遇到的OOM

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

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

(2)解决OOM

  1、在内存引用上做处理:在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内存溢出。什么时候会被收集取决于gc的算法和gc运行时可用内存的大小。

  2、显示的调用GC来回收内存,如:if(bitmapObject.isRecycled()==false) //如果没有回收 bitmapObject.recycle();

  3、设置堆内存的大小:-Xms 和 -Xmx (-XX:InitialHeapSize 和 -XX:MaxHeapSize):指定JVM初始占用的堆内存和最大堆内存。

二、SOF

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

  1、递归调用。

  2、大量循环和死循环。

(2)解决问题:检查自己的代码。

    

上一篇:OOM导致MySQL服务被kill案例一则


下一篇:10年Java开发经验,一文了解OOM及解决方案