什么是虚拟机栈
每个线程运行时所需要的内存,称为虚拟机栈。
每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈,对应着当前正在执行的那个方法。
垃圾回收是否涉及栈内存
垃圾回收主要指就是堆内存,当栈帧弹栈以后,内存就会释放。
栈内存分配越大越好吗
未必,默认的栈内存通常为1024k,栈帧过大会导致线程数变少。
方法内的局部变量是否线程安全
如果方法内局部变量没有逃离方法的作用范围,它是线程安全的如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全。
什么情况下会导致栈内存溢出
栈帧过多导致栈内存溢出,典型问题:递归调用。
栈帧过大导致栈内存溢出。
堆栈的区别是什么
栈内存一般会用来存储局部变量和方法调用,但堆内存是用来存储Java对象和数组的的。
堆会GC垃圾回收,而栈不会。
栈内存是线程私有的,而堆内存是线程共有的。
两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。
栈空间不足: java.lang.StackOverFlowError。
堆空间不足: javalang.OutOfMemoryError。