JVM:Java虚拟机栈完结与面试题
Posted liu++
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM:Java虚拟机栈完结与面试题相关的知识,希望对你有一定的参考价值。
JVM(五):Java虚拟机栈完结与面试题
栈真的是很重一块,但是后面没多少了,一鼓作气!
方法返回地址
作用:存放该方法的pc寄存器的值(pc寄存器存的是下一条指令的值)。
它的作用是获得下一条指令的值交给执行引擎,继续操作。
如果是遇到异常并且没有处理,那就方法退出。
正常完成和异常完成的区别是:异常完成出口退出的不会给它的上层调用者产生任何的返回值。
一些附加信息
保存与Java虚拟机实现相关的附加信息,可以没有。
面试题
先复习一下,看看剩下了什么。
栈是管方法的,是线程私有的,基本单位是栈帧,执行方法进栈,执行完成出栈,将返回值给栈顶的栈帧(给到操作数栈),栈没有垃圾回收,但是有OOM,会出现的异常:
StackOverflowError:当设置JVM栈大小固定时栈溢出报错
OutOfMemoryError:栈是动态大小,但是内存不够了,抛出的异常
栈帧的具体结构
局部变量表:是一个数字数组,作用存局部变量(8种基本数据类型,引用类型的引用),基本单位slot,按索引访问,对于非静态方法索引0处存this,静态方法没有this。被局部变量表引用的变量是无法垃圾回收的。
操作数栈:保存计算的中间结果,和局部变量表结合使用。
动态连接:动态链接保存的是指向方法区常量池中该方法的引用。
方法返回地址:存放该方法的pc寄存器的值(pc寄存器存的是下一条指令的值)。
回归正题
面试题!!!
1、举例栈溢出的情况
StackOverflowError,设置栈大小的命令-Xss
2、调整栈大小,就能保证不出现溢出吗?
不能,OutOfMemoryError:栈是动态大小,但是内存不够了,抛出的异常
3、分配的栈内存越大越好?
如果只是栈变大,别的堆什么的如果被挤占那就不好了。
4、垃圾回收会涉及虚拟机栈吗?
不会,栈线程私有。
5、方法中定义的局部变量是线程安全的吗?
一般是。但是传入变量那有可能不安全,返回变量也可能不安全(可能被多个线程争抢)
说实话这个有点不确定,或者说怀疑。
参考
视频:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)
书籍:《深入理解Java虚拟机》
以上是关于JVM:Java虚拟机栈完结与面试题的主要内容,如果未能解决你的问题,请参考以下文章
字节跳动Java研发面试99题(含答案):JVM+Spring+MySQL+线程池+锁