Java 谈谈你对OOM的认识

文章目录

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

前言

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

一、基础架构

Error与Exception

二、常见OOM

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

方法的递归调用

java 复制代码
public class StackOverFlowErrorDemo {
    public static void main(String[] args) {
        stackOverFlowError();
    }

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

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

new大对象

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


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

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

java 复制代码
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;
        }
    }
}

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

netty nio

java 复制代码
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);
    }
}

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

java 复制代码
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中,执行以下命令:

shell 复制代码
javac -d . UnableCreateNewThreadDemo.java

java com.kqli.oom.UnableCreateNewThreadDemo

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

相关推荐
Bazingga1 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
卷无止境2 小时前
一人公司的全栈选型指南:让 AI Agent 写得快,也让生意跑得稳
后端·python
SL_staff3 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3273 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar3 小时前
Java封装、继承、多态
java·开发语言
ly76893 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠3 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
滴啦嘟啦哒4 小时前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
weixin_307779134 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
奇牙coding4 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai