JVM(四)虚拟机栈(三)虚拟机栈面试题
1.JVM(一)JVM与Java体系结构2.JVM(二)类加载器子系统和类加载过程3.JVM(三)运行时数据区概述及线程4.JVM(四)虚拟机栈(二)栈帧结构:动态链接、方法返回地址与附加信息5.JVM(四)虚拟机栈(一)栈帧结构:局部变量表与操作数栈
6.JVM(四)虚拟机栈(三)虚拟机栈面试题
7.JVM(五)本地方法接口8.JVM(六)堆9.JVM(七)方法区10.JVM(八)对象的实例化内存布局与访问定位11.JVM(九)执行引擎12.JVM(十)StringTable13.JVM(十一)垃圾回收概述和垃圾标记阶段的算法14.JVM(十二)垃圾清除阶段算法15.JVM(十三)分代收集、增量收集以及分区算法16.JVM(十四)垃圾回收的一些额外点17.JVM(十五)垃圾回收器概述18.JVM(十六)七种垃圾收集器19.JVM调优(十七)JVM常见调优问题和工具的使用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(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步