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+线程池+锁

面试半年,凭借这份JVM面试题,我终于拿到了字节跳动的offer!

Java中JVM相关面试题-整理

Java8虚拟机(JVM)内存溢出实战

JVM虚拟机栈5栈的面试题

面试题JVM常见面试题