1.
栈帧(
Stack
Frame
):是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息。每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。
2.
局部变量表:是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。
3.
类变量有两次赋初始值的过程,一次在准备阶段,赋予系统初始值;另外一次在初始化阶段,赋予程序员定义的初始值。但局部变量就不一样了,如果一个局部变量定义了但没有赋初始值是不能使用的。
4.
操作数栈:是一个后入先出(
LIFO
)栈。方法开始执行的时候,操作数栈是空的,在方法的执行过程中,会有各种字节码指令向操作数栈中写入和提取内容,也就是入栈出栈操作。例如,在做算术运算的时候是通过操作数栈来进行的,又或者在调用其他方法的时候是通过操作数栈来进行参数传递的。
5.
动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。
6.
方法返回地址:当一个方法被执行后,有两种方式退出这个方法。第一种方式是执行引擎遇到任意一个方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者,是否有返回值和返回值的类型将根据遇到何种方法返回指令来决定,这种退出方法的方式称为正常完成出口。
7.
方法调用:方法调用阶段唯一的任务就是确定被调用方法的版本,暂时还不涉及方法内部的具体运行过程。
1)
调用目标在程序代码写好、编译器进行编译时就必须确定下来,这类方法的调用成为解析。在
Java
语言中,符合“编译期可知,运行期不可变”这个要求的方法主要有静态方法和私有方法两大类。
2)
在
Java
虚拟机里面提供了四条方法调用字节码指令,分别是:
invokestatic
(调用静态方法)、
invokespecial
(调用实例构造器方法、私有方法和父类方法)、
invokevirtual
(调用所有的虚方法)、
invokeinterface
(调用接口方法,会在运行时在确定一个实现此接口的对象)。
3)
只要能被
invokestatic
和
invokespecial
指令调用的方法,都可以在解析阶段确定唯一的调用版本,符合这个条件的有静态方法、私有方法、实例构造器和父类方法四类,它们在类加载的时候就会把符号引用解析为该方法的直接引用(虽然
final
方法是使用
invokevirtual
指令来调用的,但是由于它无法被覆盖,没有其他版本,多态选择的结果肯定是唯一的,所以
final
方法是非虚方法)。
4)
解析调用一定是个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变为可确定的直接引用,不会延迟到运行期再去完成。而分派调用则可能是静态的也可能是动态的,根据分派依据的宗量数可分为但分派和多分派。这两类分派方式两两组合就构成了静态单分派、静态多分派、动态单分派、动态多分派。
8. 方法执行:许多
Java
虚拟机的执行引擎在执行
Java
代码的时候都有解释执行和编译执行两种选择。
分享到:
相关推荐
Java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。 JVM指令主要分为:本地变量表到操作数栈类指令、操作数栈到本地变量表类指令、常数到操作数栈类指令、将数组指定索引的数组推送...
JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的,JVM屏蔽了与具体操作系统平台相关的信息,Java程序只需生成在Java虚拟机上运行的字节...
二:中篇——字节码与类的加载 三:下篇——性能监控与调优篇 一: 上篇——内存与垃圾回收器 架构: jvm依赖的架构: 栈架构/寄存器架构 栈架构 JVM的生命周期: 1.启动 通过引导类加载器(Bootstrap class loader)...
JVM是java的虚拟机,负责将java的字节码解码运行,边解码边运行 3.2:运行步骤 1、编写源代码(写一个xx.java文件) 2、编译源代码(javac.exe编译器) 3、执行编译文件(java.exe解释器) 4、交由JVM(java虚拟机...
Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...
程序代码经过编译之后转换成一种称为Java字节码的中间语言,Java虚拟机(JVM)将对字节码进行解释和运行。编译只进行一次,而解释在每次运行程序都会进行。编译后的字节码采用一种针对JVM优化过的机器码形式保存,...
Java虚拟机(Java Virtual Machine,简称JVM),Java的“一处编译,处处运行”,就是因为Java程序编译成字节码文件后可以在任何计算机的JVM上执行,所以JVM是我们学习Java的重点之一。 JVM = 类加载器(classloader) + ...
可移植性:Java字节码可以在所有安装了JVM的设备上执行,从服务器到嵌入式系统,再到移动设备和桌面应用。 健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能...
可移植性:Java字节码可以在所有安装了JVM的设备上执行,从服务器到嵌入式系统,再到移动设备和桌面应用。 健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能...
JVM进阶|java字节码 Mybatis 「Mybatis系列」Mybatis入门 「Mybatis系列」Mybatis开发方式和配置 「Mybatis系列」Mybatis高级应用 「Mybatis系列」Mybatis缓存 分布式 了解分布式架构 实践 JUnit4教程+实践 通用点赞...
java版斗地主源码 [toc] :star:JAVA基础 面向对象和面向过程的区别 面向过程 :面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的...字节码的虚拟机。保证 了java