4.虚拟机栈
每个线程运行时所需要的内存,称为虚拟机栈。在jvm里,方法的临时储存是在栈里完成的。
每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。 (正在运行的方法)
线程里的方法是逐次的进入对应的栈里的,最顶上的方法是当前执行的,被称为活动栈桢。方法全部执行完后,会反着退出栈。之后被清除。
4.1有关栈的问题
-
垃圾回收是否涉及栈内存?
不涉及,因为栈的运行结束后会按从顶至底的顺序移除栈对应的线程的方法,所以不需要垃圾回收机制来处理长久不用的垃圾。
-
栈内存分配越大越好吗?
不是的,我们的物理内存是有限的,如果栈内存分配过大,会导致我们能运行的线程数变少。
关于内存调整的方法如下:
-
方法内的局部变量是否线程安全?
如果线程的变量没被static修饰的话
int x=10;
for(int i=0;i<100;i++){
x++;
}
此时,即使有多个线程来运行这个代码,结果也是稳定的。
大概情况如图
但是,如果变量x加了static
那么就有可能出现线程安全问题,此时就需要上锁来让变量私有化。