JVM中即时编译器JIT与解释器并存

Stella981
• 阅读 503

一.学习目标

1.了解解释器与编译器的概念与作用。

2.知道jvm中三种执行模式。

3.了解热点代码。

二.解释器模式与编译器模式以及混合模式

  字节码文件通过类装载器装载,被分配被分配到JVM的运行时数据区,然后会被执行引擎执行。执行引擎以指令为单位读取Java字节码。它就像一个CPU一样,一条一条地执行机器指令。每个字节码指令都由一个1字节的操作码和附加的操作数组成。执行引擎取得一个操作码,然后根据操作数来执行任务,完成后就继续执行下一条操作码。将人能读懂的字节码文件转化为jvm可以读懂执行的语言,在jvm中通过三种方式经行转化,即解释器模式,JIT编译器模式,混合模式。

1.解释器模式

  一条一条地读取,解释并且执行字节码指令。因为它一条一条地解释和执行指令,所以它可以很快地解释字节码,但是执行起来会比较慢,没有JIT的配合下效率不高。

2.JIT编译器模式

  即时编译器把整段字节码不加筛选的编译成机器码不论其执行频率是否有编译价值,在程序响应时间的限制下,没有达到最大的优化。

3.混合模式

  在解释执行的模式下引入编译执行,刚好可以弥补相互的缺点,达到更优的效果。

  程序刚开始启动的时候,因为解释器可以很快的解释字节码,所以首先发挥作用,解释执行Class字节码,在合适的时候,即时编译器把整段字节码编译成本地代码,然后,执行引擎就没有必要再去解释执行方法了,它可以直接通过本地代码去执行它。执行本地代码比一条一条进行解释执行的速度快很多,主要原因是本地代码是保存在缓存里的。

混合模式下其各自的特点主要如下:

解释器:

  • 程序启动时首先发挥作用,解释执行Class字节码;
  • 省去编译时间,加快启动速度;
  • 但执行效率较低;

JIT编译器:

  • 程序解释运行后,JIT编译器逐渐发挥作用;
  • 编译成本地代码,提高执行效率;
  • 但占用程序运行时间、内存等资源;

三.热点代码  

  在刚开始的时候,jvm不知道这段代码,是否会频繁的调用方法,或是一个循环,也就是这段代码被多次执行,因此刚开始的时候并不会编译代码,将代码翻译成 java 字节码相对于编译这段代码并执行代码来说,要快很多。编译器回去衡量哪些方法会被频繁调用,如果一个方法的执行频率超过一个特定的值的话,那么这个方法就会被JIT编译成本地代码。而这个方法或代码块因其运行特别频繁,就会认为这是“热点代码”(Hot Spot Code)。当 JVM 执行某一方法或遍历循环的次数越多,就会更加了解代码结构,那么 JVM 在编译代码的时候就做出相应的优化。

热点代码分为二类:

  • 多次被调用的方法
  • 多次被执行的循环体

检测热点代码:

  • 方法计数器:记录方法调用的次数 
  • 回边计数器:记录代码块循环次数

当计数器数值大于默认阈值或指定阈值时,方法或代码块会被编译成本地代码。

四.总结

JVM中即时编译器JIT与解释器并存

如上图可以看出,整个java应用程序的执行过程如下:

1、源代码经javac编译成字节码,class文件

2、程序字节码经过JIT环境变量进行判断,是否属于“热点代码”(多次调用的方法,或循环等)

3、如是,走JIT编译为具体硬件处理器(如sparc、intel)机器码

4、如否,则直接由解释器解释执行

参考资料:

https://blog.csdn.net/sinat_37138973/article/details/78438806

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
限时发布!纯手打“RocketMQ笔记”
1JVM的内存区域布局java代码的执行步骤有三点java源码文件编译器字节码文件字节码文件JVM机器码机器码系统CPU执行JVM执行的字节码需要用类加载来载入;字节码文件可以来自本地文件,可以在网络上获取,也可以实时生成。就是说你可以跳过写java代码阶段,直接生成字节码交由JVM执行其中Jav
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
JIT编译性能测试
1、JIT编译器相关VM参数\server服务端模式\Xint解释器执行\Xcomp编译器执行\Xmixed混合模式\XX:TieredCompilation打开多级编译策略(JDK1.8是默认开启的,如果关闭则XX:TieredCompilation)\XX:Co
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这