27_Java 内存溢出(OOM)
475字约2分钟
2024-08-10
什么是 OOM 内存溢出
OOM
是 OutOfMemory
的缩写,一句话形容,JVM
内存就那么多,不停的往里面塞东西,结果内存不够塞不下了,就溢出了
哪些区域会发生内存溢出
用蓝色背景标注的区域可能会发生内存溢出
1、Metaspace 区域
JVM
的内存区域有一块叫做永久代,JDK1.8
以后都叫做 Metaspace
JVM
要执行我们写的代码,首先就需要将我们写好的类加载到内存里
Metaspace
这块内存区域就是用来存放系统里各种类信息的,包括 JDK
内置的一些类信息
既然 Metaspace
区域是用来存放类信息的,那就有可能会发生 OOM
2、Java 虚拟机栈
我们代码中所有方法的执行,都依赖于 JVM
进程中的某个线程去执行
每个线程都会有自己的虚拟机栈,也就是所谓的栈内存
线程执行时会为方法创建一个栈帧,将栈帧放入到自己的虚拟机栈里,在这个栈帧里存放方法定义的各种局部变量
JVM
中有个参数设置每个线程的虚拟机栈内存大小,一般是设置 1MB
既然每个线程的虚拟机栈内存大小是固定的,那就有可能发生虚拟机栈的内存溢出
3、堆内存
在代码中创建的各种各样对象都是存放在堆内存里的,我们也知道,JVM
中分配给堆内存的空间大小一般是固定的
如果堆内存已经放不下对象了,我们还不停在堆内存里创建对象,堆内存就会发生内存溢出