【JVM虚拟机篇04】虚拟机栈

28 阅读1分钟

虚拟机栈

  • 每个线程运行时所需要的内存,被称为虚拟机栈,先进后出
  • 每个栈都是由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能由一个活动栈帧,对应着当前正在执行的那个方法

image.png

垃圾回收是否涉及栈内存

垃圾回收主要指就是堆内存,当栈帧弹出以后,内存就会被释放

栈内存分配越大越好?

未必,默认栈内存通常是1024K

栈帧过大会导致线程数变少,例如,机器总内存为512,目前能活动的线程数则512个,如果把栈内存改为2048K,那么能活动的栈帧就会减半

方法内的局部变量是否是线程安全的?

image.png

  • 如果方法内局部变量没有逃离方法的作用域范围,它是线程安全的
  • 如果是局部变量引用对象,并逃离方法的作用范围,需要考虑线程安全

栈内存溢出情况(java.lang.StackOverflowError)

  • 栈帧过多导致栈内存溢出,典型问题:递归调用
  • 栈帧过大导致栈内存溢出