JVM
在弄清楚OOM产生的原因之前,我们务必要搞清楚Java的内存模型,也就是JVM,这可以参考我之前的一个学习笔记 JVM学习笔记
先来看一下要用到的JVM的一些参数:
参数名称 | 含义 |
---|---|
-Xms | 初始堆大小 |
-Xmx | 最大堆大小 |
-Xmn | 年轻代大小 |
-Xss | 每个线程的堆栈大小 |
-XX:+HeapDumpOnOutOfMemoryError | 目录下生成堆的Dump文件 |
当初始化堆内存容量小于MinHeapFreeRatio 时,JVM会增大堆直到Xmx最大限制,当空余内存大于MaxHeapFreeRatio时,JVM会减小堆直到Xms最小限制,其中MinHeapFreeRatio和MaxHeapFreeRatio都是可以配置的。
OOM
OOM全称Out Of Memory,被称为是内存溢出(OutOfMemoryError),在JVM运行时的内存区域里,除了程序计数器,其它几个区域都可能会发生内存溢出的异常,下面主要来分析堆内存上面的OOM。
堆内存的OOM
接下来模拟一个堆上发生的OOM,编写Java代码,其思路就是往List集合里面无限放匿名对象:
package com.mezjh.test;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author ZJH
* @date 2020/8/12 14:48
*/
public class TestHeapOOM {
public static void main(String[] args) {
List<TestObject> list = new ArrayList<>();
while (true) {
list.add(new TestObject());