栈顶缓存技术
频繁的执行入栈出栈操作会影响执行速度,所以,将栈顶元素缓存在物理cpu的寄存器,依次降低读写次数,提升执行引擎的效率
动态链接(指向运行时常量池的引用)
字节码文件中,带#号那里Constant pool ,就是常量池
#+数字:这叫符号引用
java源文件编译成字节码文件时,所有变量和方法都作为符号引用放在常量池里
常量池运行时在方法区里
方法区是共享的
栈帧内包含指向常量池的引用 #+数字。
常量池的意义:减小内存,提高复用性
方法的绑定机制
静态链接、早期绑定:目标方法编译阶段已知,且运行中保持不变。
动态链接、晚期绑定:编译时无法确定。父类引用指向子类对象(多态),无法确定子类方法
虚方法和非虚方法
虚方法就是子类重写的方法
方法重写的本质和虚方法表的使用
本质:从当前类的方法里找,找不到去父类找
虚方法表:存放各个方法的实际入口,使用索引表代替查找。
虚方法表创建时间:类加载的链接阶段的解析过程
方法返回地址
存放该方法pc寄存器的值,此时pc寄存器的值是下一条命令的地址。
异常处理:略。
附加信息
略
虚拟机栈的面试题
1.举例栈溢出的情况
Stack Overflow,栈帧过多,栈的内存不够。
通过-Xss设置栈的大小。或者动态扩容
如果内存不够,无法扩容,那么就是outOfMemoryError
2.调整栈的大小能保证不出现溢出吗?
不能
3.分配的栈内存越大越好吗?
会影响别的栈空间,减少线程数。
4.垃圾回收是否涉及到栈空间?
不涉及
5.线程安全问题
如果只有一个线程能操作此数据,那么一定是安全的。
如果多个线程都能操作,那么存在安全问题