栈顶缓存,动态链接,虚方法,方法绑定,栈的面试题

本文深入探讨了Java虚拟机栈中的栈顶缓存技术,如何通过将栈顶元素缓存到CPU寄存器来提升执行效率。同时讲解了动态链接、常量池、方法绑定机制以及虚方法表等概念,阐述了方法重写与虚方法的实际应用。还涉及到了栈溢出、线程安全等相关问题,并分析了调整栈大小对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈顶缓存技术

频繁的执行入栈出栈操作会影响执行速度,所以,将栈顶元素缓存在物理cpu的寄存器,依次降低读写次数,提升执行引擎的效率

动态链接(指向运行时常量池的引用)

字节码文件中,带#号那里Constant pool ,就是常量池

#+数字:这叫符号引用

java源文件编译成字节码文件时,所有变量和方法都作为符号引用放在常量池里

常量池运行时在方法区里

方法区是共享的

栈帧内包含指向常量池的引用 #+数字。

常量池的意义:减小内存,提高复用性

方法的绑定机制

静态链接、早期绑定:目标方法编译阶段已知,且运行中保持不变。

动态链接、晚期绑定:编译时无法确定。父类引用指向子类对象(多态),无法确定子类方法

虚方法和非虚方法

虚方法就是子类重写的方法

方法重写的本质和虚方法表的使用

本质:从当前类的方法里找,找不到去父类找

虚方法表:存放各个方法的实际入口,使用索引表代替查找。

虚方法表创建时间:类加载的链接阶段的解析过程

方法返回地址

存放该方法pc寄存器的值,此时pc寄存器的值是下一条命令的地址。

异常处理:略。

附加信息

虚拟机栈的面试题

1.举例栈溢出的情况

Stack Overflow,栈帧过多,栈的内存不够。

通过-Xss设置栈的大小。或者动态扩容

如果内存不够,无法扩容,那么就是outOfMemoryError

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

不能

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

会影响别的栈空间,减少线程数。

4.垃圾回收是否涉及到栈空间?

不涉及

5.线程安全问题

如果只有一个线程能操作此数据,那么一定是安全的。

如果多个线程都能操作,那么存在安全问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值