`

jvm字节码执行引擎

 
阅读更多
一. 运行时栈帧结构

1. 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的元素。栈帧存储了方法的局部变量,操作数栈,动态链接,方法返回地址等信息。

2. 对于执行引擎来讲,活动的线程,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法。

局部变量表

1. 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在java程序被编译为Class文件时,在方法的Code属性的max_locals数据项中确定该方法所需要分配的最大局部变量表的容量。

2. 局部变量表的容量以变量槽:Slot为最小单位,这些Slot是可充用的。

3. 旁门索道

Public static void main(String[] args) {

{

Byte[] b = new Byte[64*1024*1024];

}

System.gc();

}

//这是并不能立马进行GC

Public static void main(String[] args) {

{

Byte[] b = new Byte[64*1024*1024];

}

Int a = 0;

System.gc();

}

//这是立马进行GC



操作数栈

1. 操作数栈是一个后入先出的栈。操作数栈的最大深度也是在编译时写入到Code的max_stacks数据项中。

2. 操作数栈的数据类型必须与字节码指令的序列严格匹配,否则会发生错误。

动态链接

1. 指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。

2. 静态解析:部分引用会在类加载阶段或第一次使用时转化为直接引用。

3. 动态解析:部分引用将在每一次的运行期间转化为直接引用。

方法返回地址

1. 执行引擎退出方法的途径:遇到任意一个方法返回的字节码指令--正常退出;方法执行过程中遇到了异常--异常退出。

2. 不论采用任何方式退出,在方法退出之后都需要返回到方法调用的位置,程序才能继续执行,方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复他的上层方法的执行状态。


二. 方法调用

1. 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本,暂时不涉及方法内部的具体运行过程。

解析

1. 所有方法调用中的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用。方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。

2. 符合"编译器可知,运行期不变"的方法:静态方法,私有方法。

3. 方法调用指令:

invokestatic
调用静态方法

invokespecial
调用实例够在其<init>方法、私有方法、父类方法

invokevirtual
调用所有的虚方法

invokeinterface
调用接口方法,会在运行时再确定一个实现此接口的对象


4. 使用的方法:静态方法,私有方法,实例构造器,父类方法。

5. 解析调用是一个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用转变为可确定的直接引用,不会延迟到运行期间去完成。

分派

1. 静态分派:所有依赖静态类型来定位方法执行版本的分派动作都是静态分配。静态分派发生在编译阶段,确定静态分配的动作实际上不是由虚拟机来执行的。有时候重载的版本并不是唯一的,但编译器只能确定一个更合适的版本。

2. 动态分派:在运行时期根据实际类型确定方法执行版本的分派过程称为动态分配。

3. 单分派和多分派根据分派基于多种宗量可以将分派划分为多分派和单分派(宗量:方法的接收者与方法的参数统称为方法的宗量)。

4. 静态分派属于多分派类型;动态分派属于单分派类型。
分享到:
评论

相关推荐

    Java虚拟机(JVM)面试题(总结最全面的面试题!!!)

    Java虚拟机(JVM)面试题(总结最全面的面试题!...能不能解释一下方法区(重点理解)什么是JVM字节码执行引擎你听过直接内存吗?知道垃圾收集系统吗?堆栈的区别是什么?深拷贝和浅拷贝Java会存在内存泄漏吗?请说 收

    JVM执行子系统原理

    详细介绍了JVM执行子系统的工作原理,包括类文件结构与字节码指令(Class类文件结构、JVM字节码指令简介)、JVM类加载机制(类加载器、类加载时机、类加载过程)、字节码执行引擎(运行时候的栈结构、方法调用、方法...

    超硬核!!!一篇文章搞定整个JVM运行时数据区

    JVM运行时数据区1 JVM运行时数据区2 解析JVM运行时数据区2.1 方法区(Method Area)2.2 Java堆(Java Heap)2.3 程序计数器(Program Counter ...3.1 JVM字节码执行引擎3.2 垃圾收集系统3.3 直接内存(Direct Memory)...

    java中jvm原理和实现

    JVM(Java Virtual Machine)是实现Java程序运行的核心部分,它是一个虚拟机,负责将...然后通过执行引擎将字节码指令转换为机器码并执行。同时,JVM还负责垃圾回收和代码优化等任务,以提供高效的Java程序运行环境。

    JVM调优基本概念以及调优的工作流程

    类装载器、运行时数据区(内存模型)、字节码执行引擎 工作大致流程 首先我们的java类编译成class类文件,当我们的class文件开始执行,我们的虚拟机便开始工作。 类加载器将class加载到运行时数据区,然后字节码...

    JVM执行子系统.pdf

    Class 类文件结构、字节码指令、类加载机制以及基于栈的字节码解释执行引擎

    JVM与GC调优课程视频

    ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时内存篇.png?x-oss-process=style/pnp8 ├── 第4篇-对象内存布局.png?x-oss-...

    jvm相关技术分享

    概述 Java内存区域 GC与内存分配策略 虚拟机性能监控与故障处理工具 类文件结构 类加载机制 字节码执行引擎

    JAVA虚拟机精讲 pdf

    HotSpot VM 是目前市面上高性能JVM 的代表作之一,它采用解释器+JIT 编译器的混合执行引擎,使得Java 程序的执行性能从此有了质的飞跃。本书以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、...

    JVM——Java虚拟机架构

    JVM=类加载器classloader+执行引擎executionengine+运行时数据区域runtimedataarea首先Java源代码文件被Java编译器编译为字节码文件,然后JVM中的类加载器加载完毕之后,交由JVM执行引擎执行。在整个

    大厂架构师-日均百万订单量的JVM优化与高级GC调优策略实战(5.8G)

    ├─第1篇-字节码篇.png?x-oss-process=style/pnp8 ├─第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├─第3篇-运行时内存篇.png?x-oss-process=style/pnp8 ├─第4篇-对象内存布局.png?x-oss-process=style/pnp...

    java虚拟机精讲(电子工业出版社出版)

    HotSpot VM是目前市面上高性能JVM的代表作之一,它采用解释器+JIT 编译器的混合执行引擎,使得Java 程序的执行性能从此有了质的飞跃。本书以极其精练的语句诠释了 HotSpot VM的方方面面,比如:字节码的编译原理、...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第104讲 字节码执行引擎小结 00:03:38  第105讲 总结与回顾 00:10:55  第106讲 happens-before简单概述 00:15:17  第107讲 重排序问题 00:23:19  第108讲 锁的内存语义 00:13:54  第109讲 volatile的...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 189 7.4.1 类与类加载器 / 189 7.4.2 双亲委派模型 / 191 7.4.3 破坏双亲委派模型 / 194 7.5 本章小结 / 197 第8章 虚拟机字节码执行引擎 / 198 8.1 概述 / 198 8.2 运行时栈帧结构 / 199 8.2.1 局部变量...

    jvm虚拟机总结

    Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,Java虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令。 其中导致这个特性最主要的原因...

    深入理解Java虚拟机精华知识点

    Java虚拟机(JVM)是Java Virtual Machine的缩写,...类加载器负责将字节码文件加载到内存中,运行时数据区用于存储程序执行时所需的数据,执行引擎则负责执行字节码文件,而垃圾收集器则负责回收不再使用的内存空间。

Global site tag (gtag.js) - Google Analytics