jvm 字节码执行 (一)方法调用】的更多相关文章

JVM字节码执行引擎 运行时栈帧结构 局部变量表 操作数栈 动态连接 方法返回地址 附加信息 方法调用 解析 分派 –“重载”和“重写”的实现 静态分派 动态分派 单分派和多分派 JVM动态分派的实现 基于栈的字节码解释执行引擎 基于栈的指令集与基于寄存器的指令集 JVM字节码执行引擎 虚拟机是相对于“物理机”而言的,这两种机器都有代码执行能力,其区别主要是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机的执行引擎是自己实现的.因此程序员可以自行制定指令集和执行引擎的…
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习字节码执行引擎? 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步 首先,抛出灵魂三问: 虚拟机在执行代码的时候,如何找到正确的方法呢? 如何执行方法内的字节码呢? 执行代码时涉及的内存结构有哪些呢? 如果你对上述问题理解得还不是特别透彻的话,可以看下这篇文章:如果理解了,你可以关闭网页,打开游戏放松了hhh 下面,笔者将带你探究 J…
动态类型语言 动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译期. 举例子解释“类型检查”,例如代码: obj.println("hello world"); 假如这行代码是在Java语言中,并且变量obj的静态类型为java.io.PrintStream,那么变量obj的实际类型就必须是PrintStream的子类才是合法.否则,obj属于一个确实 有println(String)方法,单与PrintStream接口没有继承关系,代码依然不可能运行——因为类型检查不…
一.概述 在不同的虚拟机实现里面,执行引擎在执行Java代码的时候可能会有解释执行(通过解释器执行)和编译器执行(通过即时编译器产生本地代码执行)两种选择,所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 每个字节码指令都由一个1字节的操作码和附加的操作数组成. 二.运行时栈帧结构 栈帧(Frame Frame)是用于支持虚拟机运行方法调用和执行的数据结构,每一个栈帧都包括了局部变量表.操作数栈.动态链接.方法返回地址和一些额外的附…
原文地址:http://yhjhappy234.blog.163.com/blog/static/3163283220122204355694/ 前面我们不止一次的提到,Java是一种跨平台的语言,为什么可以跨平台,因为我们编译的结果是中间代码—字节码,而不是机器码,那字节码在整个Java平台扮演着什么样的角色的呢?JDK1.2之前对应的结构图如下所示: 从JDK1.2开始,迫于Java运行始终笔C++慢的压力,JVM的结构也慢慢发生了一些变化,JVM在某些场景下可以操作一定的硬件平台,一些核心…
前言 最近在看<Java 虚拟机规范>和<深入理解JVM虚拟机>,对于字节码的执行有了进一步的了解.字节码就像是汇编语言,是 JVM 的指令集.下面我们先对 JVM 执行引擎做一下简单介绍,然后根据实例分析 JVM 字节码的执行过程.包括: for 循环字节码分析 try-catch-finally 字节码分析 运行时栈帧结构 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素.栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地…
Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 重载(Overload) 重载(overloading) 是在一个类里面,方法名字相同,而参数不同.返回类型可以相同也可以不同. 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表. 方法的重写…
“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上,而虚拟机的执行引擎是 由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式. 运行栈帧结构 栈帧,是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈的栈元素.栈帧存储包括了局部变量.操作数栈.动态连接.方法返回地址和 一些额外的附件信息.在编译代码的时候,栈帧需要多大的局部变…
1.执行引擎 所有Java虚拟机的执行引擎都是一致的: 输入的是字节码文件,处理过程就是解析过程,最后输出执行结果. 在整个过程不同的数据在不同的结构中进行处理. 2.栈帧 jvm进行方法调用和方法执行的数据结构,是虚拟机栈的元素. (图片来自网络) 栈帧包括:局部变量表.操作数栈.动态链接.方法返回地址等 编译期就确定了需要多大的局部变量表,多深的操作数栈,这些信息全在字节码中. 只有位于栈顶的栈帧才有效,称为当前栈帧,所对应的方法就是当前正在执行的方法. 2.1 局部变量表 存放方法参数和方…
一.执行引擎      “虚拟机”的概念是相对于“物理机”而言的,这两种“机器”都有执行代码的能力.物理机的执行引擎是直接建立在硬件处理器.物理寄存器.指令集和操作系统层面的:而“虚拟机”的执行引擎是自己实现的,因此可以自定义指令集和执行引擎的结构体系,而且可以执行那些不能被硬件直接支持的指令. 在不同的“虚拟机”实现里面,执行引擎在执行JAVA代码的时候有两种方式:解析实行(通过解释器执行)和编译执行(通过即时编译器编译成本地代码执行). 二.运行时数据结构 栈帧       栈帧是用于支持虚…
invokestatic,用于static修饰的方法.任何时候调用的时候只需要类名+方法名即可,无需new.JVM直接将其映射到方法区,执行速度极快.当该方法需要参数的时候,invokestatic会使用命令将参数从栈中弹出,传递给invokestatic. invokevirtual,用于public和protected修饰而没有static修饰的方法.在invokevirtual之前,总会有两条命令,astore(从栈中弹出对象引用,然后将其存到相应位置的局部变量中) & aload(将对象…
编译器(javac)将Java源文件(.java文件)编译成Java字节码(.class文件). 类加载器负责加载编译后的字节码,并加载到运行时数据区(Runtime Data Area) 通过类加载器加载的,被分配到JVM运行时数据库的字节码会被执行引擎执行. 执行引擎以指令为单位读取Java字节码.就像CPU一样,一条一条地执行机器指令.每个字节码指令都由一个1字节的操作码和附加的操作数组成.执行引擎取得一个操作码,然后根据操作数来执行任务,完成后就继续执行下一条操作码. Java字节码是用…
概念模型上,典型的帧栈结构如下(栈是线程私有的,也就是每个线程都会有自己的栈).                     典型的帧栈结构 局部变量表 存放方法参数和方法内部定义的局部变量.在编译阶段,就在Class文件的Code属性的max_locals数据项中确定了该方法所需要分配的局部变量表的最大容量.(仅仅是变量,不包括具体的对象).</br> 局部变量表内部以变量槽(Variable Slot)为最小单位.对于byte.char.float.int.short.boolean.refe…
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是通过一个虚函数表来完成的,这也很好理解,那么java语言的多态性是怎么实现的呢?在java中是否也存在类似C++中的虚函数表的结构呢?这就需要我们从java虚拟机字节码执行引擎的执行过程来找答案了,下面就从java虚拟机字节码执行引擎的执行过程带领大家彻底理解java中的多态性. 通过前面的[jav…
目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1.8 属性表集 1.8.1 Code属性 1.8.2 Exception属性 1.8.3 LineNumberTable属性 1.8.4 LocalVariableTable属性 1.8.5 SourceFile属性 1.8.6 ConstantValue属性 1.8.7 InnerClass属性…
定义 java虚拟机字节码执行引擎是jvm最核心的组成部分之一,它做的事情很简单:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.在不同的虚拟机实现里,执行引擎在执行java代码的时候可能会有解释执行和编译执行两种选择,也可能两者兼备. 运行时栈帧结构 java字节码执行引擎在调用和执行方法的时候使用了一种叫做栈帧的数据结构. 在jvm的内存结构里,存在这一块称为虚拟机栈的内存区域,虚拟机栈中的元素就是栈帧.每个方法的调用至结束对应着一个栈帧在虚拟机栈的入栈和出栈. 栈帧数…
深入理解Java虚拟机(字节码执行引擎) 本文首发于微信公众号:BaronTalk 执行引擎是 Java 虚拟机最核心的组成部分之一.「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力,区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机执行引擎是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式. 在 Java 虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统…
概述 执行引擎是Java虚拟机最核心的组成部分之一.“虚拟机”是一个相对于“物理机”的概念 ,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式. 在Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统一外观(Facade ).在不同的虚拟机实现里面,执行引擎在执行Java代码…
五 虚拟机字节码执行引擎   1 运行时栈帧结构     ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素.     ---栈帧中存储了方法的局部变量表.操作数栈.动态连接.方法返回地址和一些附加信息.     ---每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程.     ---在编译程序代码的时候,栈帧中需要多大的局部变量表.多深的操作数栈都已经完全确定了,并且写入到方法表的Code属性之中.    …
Java虚拟机--虚拟机字节码执行引擎 所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机栈的栈元素.每一个方法从调用开始到执行完成的过程,都对应一个栈帧在虚拟机栈中的入栈出栈过程. 由于虚拟机栈是线程私有的,所以每一个线程都有一个自己的虚拟机栈,而每个虚拟机栈都是由许多栈帧组成.每一个栈帧都包括 局部变量表 操作数栈 动态连接 方法返回地址 额外附加信息 处于…
8.1.概述 执行引擎是Java虚拟机最核心的组成部分之一.“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式. 在Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统一外观(Facade). 在不同的虚拟机实现里面,执行引擎在执行Jav…
No1: 物理机的执行引擎是直接建立在处理器.硬件.指令集合操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式. No2: 执行引擎在执行java代码的时候可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择. No3: 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它时虚拟机运行时数据区中的虚拟机栈的栈元素.栈帧存储了方法的局部变量表.…
概述 Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,成为各种虚拟机执行引擎的统一外观(Facade).不同的虚拟机引擎会包含两种执行模式,解释执行和编译执行. 运行时帧栈结构 栈帧(Stack Frame)支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量.操作数栈.动态连接和方法返回地址等信息.方法调用开始到执行完成,对应这一个帧栈在虚拟机栈里面入栈和出栈的过程. 一个线程中…
之前看了一篇关于"Java finally语句到底是在return之前还是之后执行?"这样的博客,看到兴致处,突然博客里的一个测试用例让我产生了疑惑. 测试用例如下: public class FinallyTest { public static void main(String[] args) { System.out.println(getMap().get("key")); } public static Map<String,String> g…
一.概述 执行引擎是java虚拟机最核心的组成部件之一.虚拟机的执行引擎由自己实现,所以可以自行定制指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式.所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.本节将主要从概念模型的角度来讲解虚拟机的方法调用和字节码执行. 二.运行时栈帧结构 1.什么是栈帧 栈帧也叫过程活动记录,是编译器用来进行方法调用和方法执行的一种数据结构,它是虚拟机运行是数据区域中的虚拟机栈的栈元…
本文为转载,来自 前面我们不止一次的提到,Java是一种跨平台的语言,为什么可以跨平台,因为我们编译的结果是中间代码—字节码,而不是机器码,那字节码在整个Java平台扮演着什么样的角色的呢?JDK1.2之前对应的结构图如下所示: 从JDK1.2开始,迫于Java运行始终笔C++慢的压力,JVM的结构也慢慢发生了一些变化,JVM在某些场景下可以操作一定的硬件平台,一些核心的Java库甚至也可以操作底层的硬件平台,从而大大提升了Java的执行效率,在前面JVM内存模型和垃圾回收中也给大家演示了如何操…
概述从外观上看起来,所有的 Java 虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.主要从概念模型的角度来讲解虚拟机的方法调用和字节码执行. 运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表.操作数栈.动态连接和方法返回地址等信息.每一个方法从调用开始至执行完成的过程,都对应着一个栈…
虚拟机字节码执行引擎   转自https://juejin.im/post/5abc97ff518825556a727e66 所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给出的字节码指令,基于栈解释器的一种执行机制.通俗点来说,也就是 JVM 解析字节码指令,输出运行结果的一个过程.接下来我们详细看看这部分内容. 方法调用的本质 在描述「字节码执行引擎」之前,我们先从汇编层面看看基于栈帧的方法调用是怎样的.(以 IA32 型 CPU 指令集为例) IA32 的程序中使…
JVM基础结构 JVM内部结构如下:栈.堆. 栈 JVM中的栈主要是指线程里面的栈,里面有方法栈.native方法栈.PC寄存器等等:每个方法栈是由栈帧组成的:每个栈帧是由局部变量表.操作数栈等组成. 每个栈帧其实就代表一个方法 堆 java中所有对象都在堆中分配:堆中对象又分为年轻代.老年代等等,不同代的对象使用不同垃圾回收算法. -XMs:启动虚拟机预留的内存 -Xmx:最大的堆内存 一.堆的分代假设 根据研究表明,堆中对象大部分都是创建后,立马就可以被销毁的.如: 为了优化堆中的内存,将堆…