Java 谈谈你对OOM的认识

文章目录

  • 前言
  • 一、基础架构
  • 二、常见OOM
    • 1、栈内存溢出java.lang.StackOverflowError
    • 2、堆内存溢出java.lang.OutOfMemoryError:Java heap space
    • 3、GC回收时间过长java.lang.OutOfMemoryError: GC overhead limit exceeded
    • 4、NIO程序堆外内存溢出java.lang.OutOfMemoryError: Direct buffer memory
    • 5、(重要)不能创建本地线程java.lang.OutOfMemoryError: unable to create native thread
    • 6、元空间溢出java.lang.OutOfMemoryError: Metaspace


前言

对OOM部分的认识,予以记录!

一、基础架构

Error与Exception
Java 谈谈你对OOM的认识_第1张图片

二、常见OOM

Java 谈谈你对OOM的认识_第2张图片

1、栈内存溢出java.lang.StackOverflowError

方法的递归调用

public class StackOverFlowErrorDemo {
    public static void main(String[] args) {
        stackOverFlowError();
    }

    private static void stackOverFlowError() {
        stackOverFlowError();
    }
}

Java 谈谈你对OOM的认识_第3张图片

2、堆内存溢出java.lang.OutOfMemoryError:Java heap space

new大对象

public class HeapSpaceDemo {
    public static void main(String[] args) {
        byte[] bytes = new byte[30 * 1024 * 1024];
    }
}

Java 谈谈你对OOM的认识_第4张图片
Java 谈谈你对OOM的认识_第5张图片

3、GC回收时间过长java.lang.OutOfMemoryError: GC overhead limit exceeded

超过98%的时间做GC而回收了不到2%的堆内存

public class GCOverheadDemo {
    public static void main(String[] args) {
        int i = 0;
        List<String> list = new ArrayList<>();

        try {
            while (true) {
                list.add(String.valueOf(++i).intern());
            }
        } catch (Throwable e) {
            System.out.println("=================" + i);
            e.printStackTrace();
            throw e;
        }
    }
}

Java 谈谈你对OOM的认识_第6张图片

Java 谈谈你对OOM的认识_第7张图片

4、NIO程序堆外内存溢出java.lang.OutOfMemoryError: Direct buffer memory

netty nio
Java 谈谈你对OOM的认识_第8张图片

public class DirectBufferMemoryDemo {
    public static void main(String[] args) {
        System.out.println("配置的maxDirectoryMemory:" + (sun.misc.VM.maxDirectMemory() / (double)1024 / 1024) + "MB");

        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 1024 * 1024);
    }
}

Java 谈谈你对OOM的认识_第9张图片

5、(重要)不能创建本地线程java.lang.OutOfMemoryError: unable to create native thread

Java 谈谈你对OOM的认识_第10张图片

package com.kqli.oom;

public class UnableCreateNewThreadDemo {
    public static void main(String[] args) {
        for (int i = 0; ; i++) {
            System.out.println("=========" + i);
            new Thread(() -> {
                try {
                    Thread.sleep(Integer.MAX_VALUE);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

            }, "Thread-" + i).start();

        }
    }
}

将java文件复制到ubuntu中,执行以下命令:

javac -d . UnableCreateNewThreadDemo.java

java com.kqli.oom.UnableCreateNewThreadDemo

Java 谈谈你对OOM的认识_第11张图片

6、元空间溢出java.lang.OutOfMemoryError: Metaspace

Java 谈谈你对OOM的认识_第12张图片

Java 谈谈你对OOM的认识_第13张图片

你可能感兴趣的:(java,python,开发语言)