执行引擎是Java虚拟机的核心组成部分之一。

首先,想想C++和Java在编译和运行时到底有啥不一样?

下图左边,C++发布的就是机器指令,

而下图右边Java发布的是字节码,字节码在运行时通过JVM的类加载器,加载到JVM的虚拟内存的方法区,

再通过编译器、解释器做一次转换生成机器指令。执行引擎正是执行了这样的过程:输入的是内存中的字节码,处理过程是字节码解析的 等效过程,输出的是执行结果。

其次,再来看下图,JVM的内存结构:

一、执行方法。

每个线程在创建后,都会产生一个程序计数器(pc)和栈(Stack)。

其中pc中存放了下一条将要执行的指令;

Stack中存放Stack Frame,存储了 当前正在执行的方法的信息,

每个方法的执行都会产生Stack Frame,Stack Frame中存放了   传递给方法的参数、方法内的局部变量以及操作数栈;

操作数栈用于存放指令运算的中间结果;

操作数栈在概念上很像CPU寄存器(CPU的内部元件:指令寄存器IR和程序计数器PC)。

java虚拟机无法使用寄存器,所以就用 操作数栈 来存放数据。

虚拟机把操作数栈作为它的工作区 —— 大多数指令都要从这里弹出数据,执行运算,然后把结果压回操作数栈。

比如,iadd指令就要从操作数栈中弹出两个整数,执行加法运算,其结果又压回到操作数栈中。

基于(操作数)栈的指令集 和基于寄存器的区别,

基于栈的指令集 是和硬件无关的,而基于寄存器则依赖于硬件基础。

基于寄存器在效率上优势。

但是虚拟机的出现,就是为了提供跨平台的支持,所以jvm的执行引擎是基于栈的指令集。

当方法执行完毕后则从Stack中弹出,继续其他方法的执行。

在继续执行方法时,JVM主要提供了invokestatic、invokevirtual、invokeinterface和invokespecial四种指令来执行。

在类加载的第二阶段--链接的第三阶段--解析,就确定下来的,属于编译期可知,运行期不可变的方法:

(1) invokestatic:调用类的static方法,属于绑定类的调用

(2) invokespecial: 调用构造器,私有方法和父类方法,外部不可访问,绑定实例对象

还有一种是在运行时候解析的,只有在运行时才能确定下来的,主要包含以下两方面:

(3) invokeinterface:调用接口方法,不确定调用那一个实现类

(4) invokevirtual: 调用虚方法,不确定调用哪一个实现类

二、执行技术

主要的执行技术有:解释,即时编译,自适应优化、芯片级直接执行

(1)解释:属于第一代JVM;

(2)即时编译:JIT属于第二代JVM;

(3)自适应优化:(目前Sun的HotspotJVM采用这种技术)吸取第一代JVM和第二代JVM的经验,采用两者结合的方式。

开始对所有的代码都采取解释执行的方式,

并监视代码执行情况,然后对那些 经常 调用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。

若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行;

(4)芯片级直接执行:内嵌在芯片上,用本地方法执行Java字节码。

java 执行字节码_深入理解java:1.2. 字节码执行引擎相关推荐

  1. java调用子系统代码_深入理解JAVA虚拟机-Idea远程执行本地Java代码 - Java 技术驿站-Java 技术驿站...

    今天在看深入理解JAVA虚拟机的9.3节,作者实现了一个远程执行功能.这个功能可以在远程服务器中临时执行一段程序代码,而去不依赖jdk版本,不改变原有服务端程序的部署,不依赖任何第三方库,不入侵原有的 ...

  2. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)

    深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...

  3. Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3

    <深入理解Java虚拟机-JVM高级特性与最佳实践> Chap 2 Java内存区域与内存溢出异常 1.Java运行时数据区域 A.程序计数器:当前线程所执行字节码的行号指示器,线程私有( ...

  4. java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

  5. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  6. java抽象类的属性_深入理解Java抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  7. java 接口和虚构_深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  8. java注释和注解_深入理解JAVA注解(Annotation)以及自定义注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制.Java 语言中的类.方法.变量.参数和包等都可以被标注.注解可以看作是一种特殊的标记,在程序在编译或 ...

  9. java的双亲委派_深入理解Java的类加载器及双亲委派机制

    当我们在写完一个Java文件的时候,编译器会将.java文件编译成.class文件,然后当程序运行时,JVM首先会找到main方法所在类,并将main所在类的class文件字节码读到内存中,转换成JV ...

最新文章

  1. Java substring使用时有哪些注意事项?
  2. [七月挑选]使用idea创建spring boot 项目
  3. OpenCASCADE绘制测试线束:OCAF 命令之通用属性命令
  4. 无埋点实现监测的真相——革新还是噱头?
  5. P3899 [湖南集训]谈笑风生(线段树合并)
  6. Rails 3.1 CoffeeScript SASS初体验
  7. 《几何与代数导引》例2.9
  8. 几篇关于【核心网】MME、PGW、SGW和PCRF的介绍
  9. c语言中各个符号的意义及作用是什么,C语言特殊符号意义
  10. CloudStack之nfs
  11. [Python] np.unique(ndarray) 返回ndarray的无重复元素的数组
  12. 怎样提高你的Google Adsense收入
  13. 【python路上小记】匹配11位电话正则表达式
  14. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(五)——无源与有源电流镜
  15. 空间数据挖掘与空间大数据的探索与思考(五)
  16. 排序——归并(合二为一)
  17. 数电篮球电子计分器设计
  18. 滴滴校招真题——末尾0的个数
  19. 继电器驱动设计方案及问题分析
  20. 物联网产业前景看涨然5大挑战在眼前

热门文章

  1. 几个数判断大小_chemistry three 配合物的配位数
  2. MySQL协议.NET Core实现(一)
  3. asp.net panel 加html,ASP.NET 页面中动态增加的控件、添加事件
  4. mysql分库主键_分库主键设计-Mysql
  5. .java 运行文件暗掉_Eclipse的暗色方案[关闭]
  6. mongocollection java_mongodb与java的整合
  7. 计算机二级日月潭操作步骤,计算机二级考试真题-PPT-文小雨-台湾日月潭介绍
  8. iphone怎么投屏到电脑_怎么把笔记本无线投屏到电视?好用的电脑投屏电视办法...
  9. linux mysql5.7.11安装_centos 7 安装mysql 5.7.11
  10. 微软程序在Android上跑,想在Win 10上运行Android应用?这类手机用户已经可以尝鲜...