美文网首页
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