JVM中即时编译器JIT与解释器并存-深入理解jvm

2023-11-05

一.学习目标

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 在编译代码的时候就做出相应的优化。

热点代码分为二类:

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

检测热点代码:

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

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

四.总结

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

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

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

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

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

参考资料:

 

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

java学习资料分享:关注公众号[Swen学java]即可免费领取详情见java学习资源汇总

java学习资源框架.png



作者:Swen_9826
链接:https://www.jianshu.com/p/25d17b7b8ff0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM中即时编译器JIT与解释器并存-深入理解jvm 的相关文章

随机推荐

  • 解决“vue-router子路由默认视图不显示”问题

    今天在看Vue学习视频 老师讲解vue router多级路由的使用 在写完视频里的例子后 自己测试发现一个小问题 当时视频里没有提及 我是用name实现的路由之间的切换 其中一个有子路由 发现子路由的默认显示没有了 第一次默认有 第二次点击
  • JVM GC算法 CMS 详解(转)

    前言 CMS 全称Concurrent Low Pause Collector 是jdk1 4后期版本开始引入的新gc算法 在jdk5和jdk6中得到了进一步改进 它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求 能够承受垃圾回
  • Python标准库asyncio模块基本原理浅析

    Python标准库asyncio模块基本原理浅析 本文环境python3 7 0 asyncio模块的实现思路 当前编程语言都开始在语言层面上 开始简化对异步程序的编程过程 其中Python中也开始了在语言层面上对异步编程的简化 特地使用了
  • Redis分布式锁的实现(Jedis和Redisson两个方案)

    应用场景 分布式锁主要用于解决 公司中不同业务系统对同一功能的数据产生脏读或重复插入 比如公司现有三个小组分别开发WAP站 小程序 APP客户端 而这三个系统都存在领红包功能 业务要求每人每日只能领取一个红包 如果有人同时登陆三个系统那么就
  • C语言函数返回值不能直接写数组

    C语言返回值不能直接写数组 ifndef VMATH H define VMATH H ifdef cplusplus extern C endif typedef float Matrix44f 16 Matrix44f translat
  • 分布式事务理论与实践

    一 产生背景 业务服务化拆分 原本一个服务能完成的业务操作现在需要跨多个服务 分库分表 写操作可能跨多个数据库 二 理论基础 2 1 2PC协议 角色说明 事务管理器 负责分布式事务的发起与结束 以及失败重试等 事务发起方 资源管理器 本地
  • pyenv管理python版本

    一 介绍 pyenv 是 Python 版本管理工具 pyenv 可以改变全局的 Python 版本 安装多个版本的 Python 设置目录级别的 Python 版本 还能创建和管理 virtual python environments
  • 编程语言比拼之Java VS C++

    学Java还是C Java和C 都是非常受欢迎的编程语言 各有各的优势和适用场景 以下是对它们的简要比较 性能 C 通常被认为是一种更高效的编程语言 适用于对性能要求较高的应用程序 如游戏开发 嵌入式系统和高频交易等 C 具有更接近底层的控
  • 常用串口调试工具比较

    在PC机上 目前有许多免费的串口调试工具 比较常用的有 1 串口调试助手 V2 2 优点 使用方便 用户群最多 有书介绍及免费源代码 缺点 1 因采用多线程接收技术 接收有时丢数 特别在高波特率或使用USB转串口时丢数较多 2 最大只支持1
  • java数组之二分查找法(折半查找)

    二分法就是用折半的思想 屁话不多说 上源码 public class BinarySearch 二分查找法 折半 折半查找 使用条件 必须是有序数组 需要三个变量 int min 0 int max 数组 length int mid mi
  • 使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析

    使用OpenCV Numpy计算直方图 Matplot绘制直方图及分析 1 效果图 2 原理 3 源码 3 1 直方图3种计算方法和2种绘制方法 3 2 Mask遮罩图像直方图 参考 这篇博客将介绍如何使用Python OpenCV Num
  • AVALON-MM接口

    AVALON接口分为两类 一种是AVALON MM接口 一般称为MM接口 另一种是AVALON ST接口 刚出来的一种新型接口 MM接口 通过地址读写数据 更多的是用在控制上面 ST接口用于点到点的流数据接口 更多的可以用在有高速通过率的模
  • shell文件通配符(9):任意一个:?、任意数量:*、任意包含[]、[^]:任意不包含

    文章目录 一 有哪些文件通配符 二 匹配任意 匹配任意一个字符 匹配任意数量的字符串 三 匹配任意指定一个字符 1 匹配任意包含 匹配任意包含 字符范围 2 与 匹配任意不包含 四 注意事项 1 通配符组合 2 不能跨越目录层级进行通配 3
  • 云呐工单管理对售后服务的全流程进行精细化的管理

    伴随着市场环境的改变 服务管理已融入到各个行业并起着愈来愈重要的功用 成为企业提升产品附加值 施行差异化发展战略 继而获取核心竞争力的较佳方式 带来良好的服务管理有利于企业获取报告信息 减低顾客流失率和赢得更多新顾客 能够促进企业利润的稳步
  • html文字浮动效果,css浮动怎么理解?

    浮动的意义 设置了浮动属性的元素会脱离普通标准流的控制 移动到其父元素中指定的位置的过程 将块级元素放在一行 浮动会脱离标准流 不占位置 会影响标准流 浮动只有左右浮动 不会出现上下浮动 浮动的使用 基本语法格式 选择器 float 属性值
  • pycharm注释快捷键(多行注释快捷键,三引号注释快捷键...)

    一 前言 相信学习python的小伙伴们对pycharm这款软件并不陌生 有时候我们需要在pycharm里面进行批量注释 但是直接一个一个输入注释符号太麻烦了 下面教大家用快捷键进行注释 二 教程 1 多行 单行注释 import torc
  • element 表格内显示图片

    element 表格内显示图片 先看下效果图 如下 再看下前端代码
  • 时间序列分析教程(二):移动平均与指数平滑

    之前介绍了时间序列的基本概念和性质 现在就正式介绍一些处理时间序列的模型方法 第一个是移动平均法 移动平均法很简单 就是用最近的数据预测未来短时间内的数据 有简单移动平均法 真的很简单 就是用最近的一组数据 去平均 作为下一时刻的预测 S
  • C++ 大话设计之《迭代器模式》(优缺点,设计原理,常用场景)

    迭代器模式是一种行为型模式 优点 它支持以不同的方式遍历一个聚合对象 而无需暴露它的内部表示 迭代器简化了聚合类 在迭代器模式中 由于引入了抽象层 增加新的聚合类和迭代器类都很方便 无需修改原有代码 缺点 由于多了一个抽象层 会增加系统的复
  • JVM中即时编译器JIT与解释器并存-深入理解jvm

    一 学习目标 1 了解解释器与编译器的概念与作用 2 知道jvm中三种执行模式 3 了解热点代码 二 解释器模式与编译器模式以及混合模式 字节码文件通过类装载器装载 被分配被分配到JVM的运行时数据区 然后会被执行引擎执行 执行引擎以指令为