OOM是堆内存溢出,产生的原因是堆的空间大小是有限的,当堆空间的大小不足以满足创建对象所需要的内存空间时,就会抛出OOM的异常。
StackOverflowError是栈内存溢出的意思。栈中主要存储的是8种基本数据类型 + 引用类型 + 实例方法,栈的空间也是有限的,当存储进栈中的容量大于栈的最大容量时,就会报StackOverflowError的错误。
对于OOM来说,可以在程序运行时设置VM 参数,来观察堆内存溢出的细节,参数为:-XX:+PrintGCDetails
- /**
- * @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);
- }
- }
-
- }
- /**
- * @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();
- }
- }
-
- }