Java虚拟机规范阅读笔记—第2章
运行时数据区包括:PC、栈、堆、方法区、栈帧(Frames)、
栈:
跟栈相关的异常有:
StackOverflowError:如果栈的大小是固定的,那么如果某个线程尝试获取超过这个规格的栈的时候会抛这个异常;
OutOfMemoryError:如果栈的大小是可扩展的,那么如果在扩展的时候发现系统以及没有可用内存,会抛出这个异常;
栈帧
在发生一个方法调用的时候会创建一个栈帧,在方法执行结束(无论是正常结束还是抛出异常)的时候栈帧会被销毁。栈帧在JVM的栈上分配,栈属于某个线程。每个栈帧都有自己的本地变量数组、运算元栈、指向运行时常量池的引用和指向当前方法所属类的引用。
注意:
运算元栈的作用类似于CPU中的寄存器。参考:https://stackoverflow.com/questions/24427056/what-is-an-operand-stack
运算元栈中的数据带有类型
本地变量用于存放方法参数和本地变量,对于类的方法调用:方法参数从本地变量数组的0开始;对于实例对象的方法调用:位置0用于存放被调用方法的实例,即this,其他方法参数和本地变量从1开始存放。
特殊方法
- init和cinit方法:https://stackoverflow.com/questions/8517121/java-what-is-the-difference-between-init-and-clinit
签名多态方法(Signature Polymorphic Methods)
MethodHandle(java 7引入),动态确定目标方法,把Method Handle与C/C++中的Function Pointer,或者C#里面的Delegate类比一下
VarHandle(java 9引入)