【JVM】模拟OutOfMemoryError

按照Java虚拟机规范,除了程序计数器外,其他区域都有可能出现OutOfMemoryError。模拟基于OpenJDK8,HotSpot虚拟机。
【JVM】模拟OutOfMemoryError_第1张图片

(运行时数据区划分)

一、Java堆溢出

现象常见,且可以模拟出OutOfMemoryError

1、代码

import java.util.ArrayList;
import java.util.List;

/**
 * 堆:大部分对象存储于堆中
 * OOM:分配空间不足以容纳新创建的对象实例
 * @author ice
 * @date 2021-02-21 18:44
 */
public class HeapOOMTest {
    public static void main(String[] args) {
        List<HeapOOMTest> list = new ArrayList<>();
		//循环添加直至内存溢出
        while (true){
            HeapOOMTest oo = new HeapOOMTest();
            list.add(oo);
        }
    }
}

2、Idea设置vm
按下图设置该程序单独的vm

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

【JVM】模拟OutOfMemoryError_第2张图片
3、结果
运行报Java heap space溢出
用IDE自带的Profiler查看堆转储快照信息。分析Biggest Objects /GC Roots内容,可以快速定位内存泄露位置。

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid10310.hprof ...
Heap dump file created [28231696 bytes in 0.249 secs]

在这里插入图片描述
二、Java虚拟机栈溢出

几乎见不到,单线程下只有StackOverflowError;多线程下与栈无关,为直接内存溢出

1、代码

/**
 * Java虚拟机栈与本地方法栈:存储局部变量、方法出口
 * 1、OOM:栈空间不足或栈动态扩容失败时
 * 2、StackOverflowError:栈深度大于JVM设置的最大深度 -Xss160k
 *
 * @author ice
 * @date 2021-02-21 18:16
 */
public class StackOverflowTest {
    private Integer index = 1;

    /**
     * 递归循环
     * @param i 计数
     */
    public void doWhile(int i){
        i++;
        doWhile(i);
    }
    public static void main(String[] args) {
        StackOverflowTest test = new StackOverflowTest();
        //栈溢出
        test.doWhile(test.index);
    }
}

2、vm设置:-Xss160k(mac环境)
3、结果
报StackOverflowError错误

Exception in thread "main" java.lang.StackOverflowError
	at com.xxx.roman.modules.jvm.StackOverflowTest.doWhile(StackOverflowTest.java:20)

你可能感兴趣的:(Java虚拟机,jvm)