1、Java虚拟机的执行引擎都是一致的:输入的字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。
2、栈帧
(1)每个方法从调用开始到执行完成的过程,就对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
(2)方法返回地址:只要本方法的异常表中没有搜索到匹配的异常处理器,那么将不会给它的上层调用者产生任何返回值。
3、方法调用
一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(即直接引用),在类加载期间甚至到运行期间才能确定目标方法的直接引用。
(1)解析
类加载的解析阶段,将其中一部分符号引用转化为直接引用。即调用目标在编译器进行编译时就必须确定下来,这类方法的调用称为解析。主要包括静态方法和私有方法(还包括实例构造器、父类方法、final方法),因为它们不可能通过继承或别的方式重写出其他版本。
(2)分派
动态分派:运行期根据变量的实际类型确定方法执行版本的分派过程。
Java重写的本质:第一次在运行期确定接收者的实际类型,然后把常量池中的类方法符号引用解析到不同的直接引用上。
4、Java编译器输出的指令流,基本上是一种基于栈的指令集架构。相比基于寄存器的指令集,其优点在于可移植性,缺点在于执行速度相对较慢。