Java虚拟机规范阅读笔记—第2章

运行时数据区包括:PC、栈、堆、方法区、栈帧(Frames)、

栈:

跟栈相关的异常有:

  1. StackOverflowError:如果栈的大小是固定的,那么如果某个线程尝试获取超过这个规格的栈的时候会抛这个异常;

  2. OutOfMemoryError:如果栈的大小是可扩展的,那么如果在扩展的时候发现系统以及没有可用内存,会抛出这个异常;

栈帧

在发生一个方法调用的时候会创建一个栈帧,在方法执行结束(无论是正常结束还是抛出异常)的时候栈帧会被销毁。栈帧在JVM的栈上分配,栈属于某个线程。每个栈帧都有自己的本地变量数组、运算元栈、指向运行时常量池的引用和指向当前方法所属类的引用。

注意:

  1. 运算元栈的作用类似于CPU中的寄存器。参考:https://stackoverflow.com/questions/24427056/what-is-an-operand-stack

  2. 运算元栈中的数据带有类型

  3. 本地变量用于存放方法参数和本地变量,对于类的方法调用:方法参数从本地变量数组的0开始;对于实例对象的方法调用:位置0用于存放被调用方法的实例,即this,其他方法参数和本地变量从1开始存放。

特殊方法

  1. init和cinit方法:https://stackoverflow.com/questions/8517121/java-what-is-the-difference-between-init-and-clinit

签名多态方法(Signature Polymorphic Methods)

  1. MethodHandle(java 7引入),动态确定目标方法,把Method Handle与C/C++中的Function Pointer,或者C#里面的Delegate类比一下

  2. VarHandle(java 9引入)

    1. 目标是:https://stackoverflow.com/questions/43558270/correct-way-to-use-varhandle-in-java-9

你可能感兴趣的:(Java虚拟机规范阅读笔记—第2章)