美文网首页
OutOfMemoryError异常

OutOfMemoryError异常

作者: renyjenny | 来源:发表于2021-03-02 16:28 被阅读0次

Java堆溢出

import java.util.ArrayList;
import java.util.List;

/**
 * -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError
 * 限制Java堆的大小为20M,不可扩展
 * @author renyj
 *
 */
public class OOMTest {
    
    static class OOMObject{
        
    }
    
    public static void main(String[] args) {
        List<OOMObject> objs = new ArrayList<>();
        
        while(true) {
            objs.add(new OOMObject());
        }
        
    }

}

// 运行结果
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid16556.hprof ...
Heap dump file created [28122391 bytes in 0.161 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Java堆的作用是存储对象实例,不断创建对象,并使垃圾回收机制不回收这些对象,当对象数量超过最大堆的容量限制后,就会产生OutOfMemory异常。
异常信息中的java.lang.OutOfMemoryError: Java heap space则表示在Java堆中发生了OOM异常。要分析异常,先判断此为内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)

内存泄漏:垃圾收集器无法自动回收已创建对象。
内存溢出:申请的内存大于系统能给的内存。

虚拟栈和本地方法栈溢出

  • StackOverflowError:线程请求的栈深度大于虚拟机所允许的最大深度。
  • OutOfMemoryError:虚拟机在扩展栈时无法申请到足够的内存空间。
/**
 * -Xss128k
 * @author renyj
 *
 */
public class JavaVMStackSOF {
    private int stackLength = 1;

    public static void main(String[] args) throws Throwable {
        JavaVMStackSOF oom = new JavaVMStackSOF();
        try {
            oom.stackLeak();
        } catch (Throwable e) {
            System.out.println("stacklength==================" + oom.stackLength);
            throw e;
        }

    }

    private void stackLeak() {
        stackLength++;
        stackLeak();

    }

}
// result
stacklength==================981
Exception in thread "main" java.lang.StackOverflowError
    at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:20)
    at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:21)

相关文章

网友评论

      本文标题:OutOfMemoryError异常

      本文链接:https://www.haomeiwen.com/subject/ibcmjftx.html