虚拟机栈
- 每个线程运行时所需要的内存,被称为虚拟机栈,先进后出
- 每个栈都是由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
- 每个线程只能由一个活动栈帧,对应着当前正在执行的那个方法
垃圾回收是否涉及栈内存
垃圾回收主要指就是堆内存,当栈帧弹出以后,内存就会被释放
栈内存分配越大越好?
未必,默认栈内存通常是1024K
栈帧过大会导致线程数变少,例如,机器总内存为512,目前能活动的线程数则512个,如果把栈内存改为2048K,那么能活动的栈帧就会减半
方法内的局部变量是否是线程安全的?
- 如果方法内局部变量没有逃离方法的作用域范围,它是线程安全的
- 如果是局部变量引用对象,并逃离方法的作用范围,需要考虑线程安全
栈内存溢出情况(java.lang.StackOverflowError)
- 栈帧过多导致栈内存溢出,典型问题:递归调用
- 栈帧过大导致栈内存溢出