JVM(四)虚拟机栈(三)虚拟机栈面试题
1 举例栈溢出的情况?
- 当方法调用不停将栈帧压入虚拟机栈导致栈内空间不足而出现
StackOverFlowError
即是出现了栈溢出 - 可以通过-Xss设置栈的大小,栈的大小可以是固定的也可以是动态变化的,如果固定且超出设定值则就会出现栈溢出;如果是动态变化的,栈空间不断扩容导致整个内存空间不足以分配,则会出现
OutOfMemoryError
调整栈的大小就能保证栈不溢出了吗
- 不能,只能延迟栈溢出的时间
分配的栈内存越大越好吗
- 不是,毕竟整个内存的空间是有限的,栈占据的空间越大会导致其他部分占据的空间越小
2 垃圾回收是否涉及到虚拟机栈?
不会涉及到虚拟机栈,运行时数据区主要包括程序计数器
、本地方法栈
、虚拟机栈
、方法区
和堆
五部分:
- 程序计数器:存储指令地址,运行速度快占用空间小,不存在溢出问题,也没有垃圾回收
- 本地方法栈:存在栈溢出,但是不存在垃圾回收
- 虚拟机栈:存在栈溢出,但是不存在垃圾回收
- 方法区和堆:存在OOM和GC
3 ⭐方法中定义的局部变量是否线程安全?
-
不一定,要看这个局部变量有没有指向外部的共享变量,如果有的话也是线程不安全的
-
如果方法返回该局部变量,也有可能是线程不安全的,因为可能有其他线程接着对其进行修改:
public static StringBuilder method() { StringBuilder s = new StringBuilder(); s.append("1"); return s; }
而下面的方法是线程安全的,因为String的不可变性:
public static StringBuilder method() { StringBuilder s = new StringBuilder(); s.append("1"); return s.toString(); }