HOME/Articles/

jvm栈和本地方法栈

Article Outline

jvm栈

在java代码执行的过程中,方法以及这个方法的相关参数,会放到jvm栈中,每个方法以及这个方法的相关变量,叫做栈帧。

jvm栈的大小与垃圾回收

1、垃圾回收机制并不会回收栈内存中的东西,因为栈内存中的变量等,会随着方法的调用完成自动弹出栈。

2、因为每个线程对应一个栈,并且内存的总大小是固定不变的,所以,每个栈的大小应该合适,如果一个栈的内存大小设置的过大,会使java的线程数下降。

jvm栈的安全性问题

1、共享的变量,需要考虑安全性的问题,如果变量是私有的(如在方法中声明),那么就不需要考虑线程安全的问题,因为每个线程对应独立的栈帧。

2、此外,判断哪一个变量是不是安全的,除了看该变量是不是在方法中声明的私有变量,还要看这个变量有没有作为结果返回。(即这个变量,有没有可能被别的线程调用到,如果可能被调用到,则需要考虑线程安全的问题。例如 通过return返回出去,那么别的方法可能会调用到这个返回出去的变量。)

关于栈溢出

一般栈溢出会有两种情况

- 栈帧过多导致的栈溢出 如递归等
- 栈帧过大导致的栈内存溢出 

栈帧1.PNG

通过IDEA的DEBUG模式,可以看到栈帧以及相关参数