JVM面试题汇总

一PC寄存器

1.使用PC寄存器存储字节码指令地址有什么用呢?/ 为什么使用PC寄存器记录当前线程的执行地址呢? 因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行
JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令

2.PC寄存器为什么会设定为线程私有

假设有三个线程ABC,切换线程时,A线程执行到第五步,也就是上面说的指令地址5,这时候切换到B了,那再切换回来怎么办呢?A线程的程序计数寄存器就存了5,等切换回A线程的时候就从第五步开始执行,这就是程序计数寄存器的作用。

这也是为什么程序计数寄存器为什么说是线程私有的原因,因为如果是共有的,共享的,那么我从A线程切换到B线程的时候,程序计数寄存器存的是5,这时候我B线程执行到第3步再切换到C线程,程序计数寄存器存的就是3了,这时候如果我还是回到A线程的话,那么就是执行的第三步了,但我要执行的是第五步,所以必须保证线程私有。
 

二双亲委派机制的优势

  • 避免类的重复加载
  • 保护程序安全,防止核心API被随意篡改
    • 自定义类:java.lang.String
    • 自定义类:java.lang.MeDsh(java.lang包需要访问权限,阻止我们用包名自定义类)

 

三Java虚拟机规范中没有规定任何OOM情况的区域是哪个?

PC寄存器

5.方法中定义的局部变量是否线程安全?

四虚拟机栈的5道面试题

1.举例栈溢出的情况?(StackOverflowError)

  • 递归调用等,通过-Xss设置栈的大小;

2.调整栈的大小,就能保证不出现溢出么?

  • 不能 如递归无限次数肯定会溢出,调整栈大小只能保证溢出的时间晚一些

3.分配的栈内存越大越好么?

  • 不是 会挤占其他线程的空间

4.垃圾回收是否会涉及到虚拟机栈?

  • 不会

5.方法中定义的局部变量是否线程安全?

  • 要具体情况具体分析

 

堆空间一定是所有线程共享的么?

不是,TLAB线程在堆中独有的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值