一、什么是OOM?
OOM是堆内存溢出,产生的原因是堆的空间大小是有限的,当堆空间的大小不足以满足创建对象所需要的内存空间时,就会抛出OOM的异常。
二、什么是StackOverflowError?
StackOverflowError是栈内存溢出的意思。栈中主要存储的是8种基本数据类型 + 引用类型 + 实例方法,栈的空间也是有限的,当存储进栈中的容量大于栈的最大容量时,就会报StackOverflowError的错误。
三、有哪些方法分析?
对于OOM来说,可以在程序运行时设置VM 参数,来观察堆内存溢出的细节,参数为:-XX:+PrintGCDetails
四、案例演示
4.1、OOM案例代码
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/11/16 15:31
* @Description: 修改堆内存的最大值和最小值为10m,方便观察GC的回收过程
* -Xms10m -Xmx10m -XX:+PrintGCDetails
*/
public class OomMainApp {
public static void main(String[] args) {
String message = "欧耶,今天星期五!";
while (true) {
message += message + new Random().nextInt(88888888) + new Random(99999999);
}
}
}
4.2、StackOverflowErroe案例代码
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/11/16 18:55
* @Description: 测试栈溢出
* 提前修改栈的大小:-Xss128k
*/
public class StackMainApp {
private int stackLength = 1;
public void stackLeak() {
stackLength++;
stackLeak();
}
public static void main(String[] args) {
StackMainApp stackMainApp = new StackMainApp();
try {
stackMainApp.stackLeak();
} catch (Throwable e) {
System.out.println("stackLength = " + stackMainApp.stackLength);
e.printStackTrace();
}
}
}