JVM学习02

虚拟机栈

  • 每个线程运行时JVM开辟一块新的内存称为虚拟机栈,后进先出的特点。
  • 每个栈由多个栈帧组成,每个栈帧对应每个方法调用时所需的内存。
  • 每个线程只能有一个活动栈帧,对应当前线程正在执行的某个方法。
    image

栈内存溢出

  • JVM默认栈内存分配大小为1024k,若栈帧过多(不当的递归调用)或栈帧过大都会导致默认的栈内存不够从而栈内存溢出。
  • 可通过配置VM options指定-Xss2048k合理调整栈内存大小,但并非分配越大越好,分配栈内存越大,能开启的线程数量则相对减少,活动栈帧也随之减少。
  • 实体之间属性循环依赖,在将实体类转换成Json字符串时容易出现栈内存溢出问题。

栈帧过多溢出例子如下

public class JVM01 {

    public static int count;

    public static void main(String[] args) {
        try {
            m1();
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("m1调用"+count+"次后栈内存溢出");
        }
    }
    public static void m1(){
        count++;
        m1();
    }
}
posted @ 2023-06-13 15:54  加瓦同学  阅读(11)  评论(0编辑  收藏  举报