当前位置: 首页 > news >正文

JVM解释器与JIT编译器如何并存?

[1] JVM解释器

  JVM设计的初衷仅仅只是为了满足Java程序实现跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码的执行程序。

  解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行,当一条字节码指令被解释执行完成后,接着再根据PC寄存器中记录的下一条需要被执行的字节码指令执行解释操作。

  由于解释器在设计和实现上非常简单,因此除了Java语言之外,还有许多高级语言同样也是基于解释器执行的,比如Python、 Perl、Ruby等。

  但是在今天,基于解释器执行已经沦落为低效的代名词,但无论如何基于解释器的执行模式仍然为中间语言的发展做出了不可磨灭的贡献。

[2] JIT编译器

  Java中三个编译器:

  Java 语言的“编译器” 其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端” 更准确一些)把.java文件转变成.class文件的过程。

  也可能是指虚拟机的后端运行期编译器(JIT 编译器,Just In Time Compiler)把字节码转变成机器码的过程。

  还可能是指使用静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把.java文件编译成本地机器代码的过程。

  Java中三个编译名词:

  1、动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static compilation)。

  2、JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价;但要注意广义与狭义的JIT编译所指的区别。

  3、自适应动态编译(adaptive dynamic compilation)也是一种动态编译,但它通常执行的时机比JIT编译迟,先让程序“以某种式”先运行起来,收集一些信息之后再做动态编译。这样的编译可以更加优化。

  JIT编译器:

  在部分商用虚拟机中(如HotSpot),Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。

  为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler)。

  即时编译器并不是虚拟机必须的部分,Java虚拟机规范并没有规定Java虚拟机内必须要有即时编译器存在,更没有限定或指导即时编译器应该如何去实现。

  但是,即时编译器编译性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键的指标之一,它也是虚拟机中最核心且最能体现虚拟机技术水平的部分。

  由于Java虚拟机规范并没有具体的约束规则去限制即使编译器应该如何实现,所以这部分功能完全是与虚拟机具体实现相关的内容,如无特殊说明,我们提到的编译器、即时编译器都是指Hotspot虚拟机内的即时编译器,虚拟机也是特指HotSpot虚拟机。

[3] HotSpot虚拟器中解释器和编译器如何并存?

  尽管并不是所有的Java虚拟机都采用解释器与编译器并存的架构,但许多主流的商用虚拟机(如HotSpot),都同时包含解释器和编译器。

  解释器与编译器两者各有优势:当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。

  在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。

  当程序运行环境中内存资源限制较大(如部分嵌入式系统中),可以使用解释器执行节约内存,反之可以使用编译执行来提升效率。此外,如果编译后出现“罕见陷阱”,可以通过逆优化退回到解释执行。

  解释器的执行,抽象的看是这样的:输入的代码 -> [ 解释器 解释执行 ] -> 执行结果

  而要JIT编译然后再执行的话,抽象的看则是:输入的代码 -> [ 编译器 编译 ] -> 编译后的代码 -> [ 执行 ] -> 执行结果

  说JIT比解释快,其实说的是“执行编译后的代码”比“解释器解释执行”要快,并不是说“编译”这个动作比“解释”这个动作快。

  JIT编译再怎么快,至少也比解释执行一次略慢一些,而要得到最后的执行结果还得再经过一个“执行编译后的代码”的过程。

  所以,对“只执行一次”的代码而言,解释执行其实总是比JIT编译执行要快。怎么算是“只执行一次的代码”呢?粗略说,下面两个条件同时满足时就是严格的“只执行一次”:

  1、只被调用一次,例如类的构造器(class initializer,())

  2、没有循环

  对只执行一次的代码做JIT编译再执行,可以说是得不偿失。

  对只执行少量次数的代码,JIT编译带来的执行速度的提升也未必能抵消掉最初编译带来的开销。

  只有对频繁执行的代码,JIT编译才能保证有正面的收益。

  对一般的Java方法而言,编译后代码的大小相对于字节码的大小,膨胀比达到10x是很正常的。

  同上面说的时间开销一样,这里的空间开销也是,只有对执行频繁的代码才值得编译,如果把所有代码都编译则会显著增加代码所占空间,导致“代码爆炸”。

  这也就解释了为什么有些JVM会选择不总是做JIT编译,而是选择用解释器+JIT编译器的混合执行引擎。

相关文章:

JVM解释器与JIT编译器如何并存?

[1] JVM解释器 JVM设计的初衷仅仅只是为了满足Java程序实现跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码的执行程序。 解释器真正意义上所承担的角色就是一个运行时“翻译者”&#xff0…...

生产者消费者模型

目录 一、生产者消费者模型的概念 二、生产者消费者模型的特点 三、生产者消费者模型优点 四、基于BlockingQueue的生产者消费者模型 4.1 基本认识 4.2 模拟实现 一、生产者消费者模型的概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题 生产者和…...

mysql索引--实例

学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:SC (Sno, Cno, Score)…...

浅聊一下,可中断锁(ReentrantLock)

前言 今天早上上厕所,上的我痔疮犯了,屁股一坐下去就感觉一根针在刺我,得的是外痔,之前还坚持用痔疮膏来着,但是感觉涂药的那个姿势以及位置我实在无法忍受,就把它给断了,到头来还是屁股糟了罪&…...

关于Arcgis林业数据处理的62个常用技巧

一、计算面积 ( 可以帮我们计算小班面积 ) 添加 AREA 字段,然后右键点击字段列,然后点击 CALCULATE VALUES; ---> 选择 ADVANCED --》把下面的代码输入,然后在最下面 处写 OUTPUT 点击 OK 就 OK 了。 Dim Outp…...

一些NLP术语

一些NLP术语pre-training(预训练)fine-tuning(微调)下游任务Few-shot Learning(少样本学习)Prompt?(自然语言提示信息)二级标题三级标题pre-training(预训练&…...

Session详解,学习 Session对象一篇文章就够了

目录 1 Session概述 2 Session原理 3 Session使用 3.1 获取Session 3.2 Session保存数据 3.3 Session获取数据 3.4 Session移除数据 4 Session与Request应用区别 4.1 Session和request存储数据 4.2 获取session和request中的值 4.3 session和request区别效果 5 Sess…...

Java——不同的子序列

题目链接 leetcode在线oj题——不同的子序列 题目描述 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新…...

Git 基本操作之Git GUI界面和git命令行如何选择

1. 为啥推荐使用git命令行 我发现公司有很多的同事都喜欢使用git的GUI界面工具,喜欢鼠标点点点就完成了代码的提交,这种方式的确是比较简单便捷,但是却存在风险。先上一个事故给大家醒醒脑。 VScode Git 界面操作引发的惨案 上面的惨案是VS…...

Python编程 动态爱心

作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.所用库 1.random简介 2.math 简介 3.tkinter库的简介 二.实际图 三.…...

JavaScript :基础语法

位置&#xff1a; HTML 中的 Javascript 脚本代码必须位于 <script> 与 </script> 标签之间。 JavaScript 输出方式 window.alert() 弹出警告框。document.write() 将内容写到 HTML 文档中。innerHTML 写入到 HTML 元素。console.log() 写入到浏览器的控制台。 …...

buu [AFCTF2018]Single 1

题目描述&#xff1a; Jmqrida rva Lfmz (JRL) eu m uqajemf seny xl enlxdomrexn uajiderc jxoqarerexnu. Rvada mda rvdaa jxooxn rcqau xl JRLu: Paxqmdyc, Mrrmjs-Yalanja mny oekay. Paxqmdyc-urcfa JRLu vmu m jxiqfa xl giaurexnu (rmusu) en dmnza xl jmrazxdeau. Lxd …...

Linux C++ 200行完成线程池类

文章目录1、atomic使用2、volatile关键字3、条件变量4、成员函数指针使用5、线程池6、主线程先退出对子线程影响7、return、exit、pthread_exit区别8、进程和线程的区别1、atomic使用 原子操作&#xff0c;不可分割的操作&#xff0c;要么完整&#xff0c;要么不完整。 #includ…...

C语言指针剖析(初阶) 最详细!

什么是指针&#xff1f;指针和指针类型野指针指针运算指针和数组二级指针指针数组什么是指针&#xff1f;指针是内存中一个最小单元的编号&#xff0c;也就是地址。1.把内存划分为一个个的内存单元&#xff0c;一个内存单元的大小是一个字节。2.每个字节都给定唯一的编号&#…...

AcWing语法基础课笔记 第三章 C++中的循环结构

第三章 C中的循环结构 学习编程语言语法是次要的&#xff0c;思维是主要的。如何把头脑中的想法变成简洁的代码&#xff0c;至关重要。 ——闫学灿 学习循环语句只需要抓住一点——代码执行顺序&#xff01; while循环 可以简单理解为循环版的if语句。If语句是判断一次&#xf…...

A simple freeD tracking protocol implementation written in golang

可以使用的go版本freed调试代码 可以通过udp发送和接收数据 What is freeD? freeD is a very simple protocol used to exchange camera tracking data. It was originally developed by Vinten and is now supported by a wide range of hard- and software including Unreal…...

简约精美电商小程序【源码好优多】

简介 一款开源的电商系统&#xff0c;包含微信小程序和H5端&#xff0c;为大中小企业提供移动电子商务优秀的解决方案。 后台采用Thinkphp5.1框架开发&#xff0c;执行效率、扩展性、稳定性值得信赖。并且Jshop小程序商城上手难度低&#xff0c;可大量节省定制化开发周期。 功…...

全网详解 .npmrc 配置文件:比如.npmrc的优先级、命令行,如何配置.npmrc以及npm常用命令等

文章目录1. 文章引言2. 简述.npmrc3. 配置.npmrc3.1 .npmrc配置文件的优先级3.2 .npmrc设置的命令行3.3 如何设置.npmrc4. 配置发布组件5. npm常用命令6. 重要备注6.1 yarn6.2 scope命名空间6.3 镜像出错1. 文章引言 今天在某低代码平台开发项目时&#xff0c;看到如下编译配置…...

从0开始学python -31

Python3 模块-1 在前面的几个章节中我们基本上是用 python 解释器来编程&#xff0c;如果你从 Python 解释器退出再进入&#xff0c;那么你定义的所有的方法和变量就都消失了。 为此 Python 提供了一个办法&#xff0c;把这些定义存放在文件中&#xff0c;为一些脚本或者交互…...

Jenkins的使用教程

介绍&#xff1a; Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 目的: 最重要目的就是把原来分散在各个机器上繁杂的工作全部…...

手把手教你用C8051F330自制BLheli电调:从测绘XP-12A到暴力测试70涵道

从零构建BLheli电调&#xff1a;C8051F330硬件逆向与70涵道暴力测试全指南 当你拆开一台现成的航模电调&#xff0c;看到里面密密麻麻的元件时&#xff0c;是否想过自己也能从头打造一个&#xff1f;本文将带你深入电调硬件设计的核心&#xff0c;从测绘商业电调XP-12A开始&…...

算法题(回溯)

一、题目1、括号生成&#xff08;LC 22&#xff09;2、单词搜索&#xff08;LC 79&#xff09;二、题解1、括号生成&#xff08;LC 22&#xff09;&#xff08;1&#xff09;分析采用回溯的思想解决。递归方法包括 left、right、ans、path、n 五个核心参数&#xff0c;其中 lef…...

硬件工程师的办公室布局与效率系统:从工具管理到创意激发

1. 我的“极乐之穹”&#xff1a;一个硬件工程师的办公室漫游每次在博客里提到“极乐之穹”&#xff0c;指的都是我的办公室。偶尔&#xff0c;我也会聊起在四处搜罗时遇到并收入囊中的那些令人心动的电子设备或“艺术品”。时间久了&#xff0c;总有人让我拍点照片分享。问题在…...

WPF动画避坑指南:Blend路径动画Canvas.Left与RenderTransform的实战选择(附性能对比)

WPF动画避坑指南&#xff1a;Blend路径动画Canvas.Left与RenderTransform的实战选择&#xff08;附性能对比&#xff09; 在WPF开发中&#xff0c;动画效果的实现往往让开发者陷入选择困境。特别是当我们需要让UI元素沿着复杂路径运动时&#xff0c;Canvas.Left/Top与RenderTra…...

BetterOCR:融合多引擎OCR与LLM的智能文档理解方案

1. 项目概述&#xff1a;当OCR遇上AI&#xff0c;一场关于“理解”的进化 最近在折腾一个文档自动化的项目&#xff0c;发现传统的OCR&#xff08;光学字符识别&#xff09;工具虽然能把图片里的文字“读”出来&#xff0c;但效果总差那么点意思。比如&#xff0c;一张随手拍的…...

3分钟学会Xbox Game Pass存档提取:免费工具实现跨平台游戏进度迁移

3分钟学会Xbox Game Pass存档提取&#xff1a;免费工具实现跨平台游戏进度迁移 【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor 作为游戏…...

Midjourney生成图落地PS的7大断层痛点:从提示词对齐、分辨率陷阱到图层级精修,一文打通AI与专业图像处理全链路

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney与Photoshop整合方案的底层逻辑与工作流重构 Midjourney 生成的图像虽具高美学质量&#xff0c;但缺乏图层控制、非破坏性编辑及像素级精度&#xff0c;而 Photoshop 正是弥补这一缺口的核心…...

PCB设计数据管理:挑战、实践与关键技术

1. PCB设计数据管理的核心挑战与行业现状在电子行业快速迭代的今天&#xff0c;印刷电路板(PCB)设计团队面临着前所未有的时间压力。根据行业调研数据&#xff0c;领先企业通过优化数据管理实现了22%的PCB开发时间缩减&#xff0c;而落后企业同期开发时间反而增加了9%。这种差距…...

ARM GICv5 ITS_CR1寄存器配置与中断优化实践

1. ARM GICv5 ITS架构概述中断控制器是现代计算机系统中的关键组件&#xff0c;负责管理和分发硬件中断请求。ARM GICv5架构中的Interrupt Translation Service (ITS)模块通过创新的设备ID和事件ID映射机制&#xff0c;实现了灵活高效的中断路由方案。ITS作为GICv5的可选扩展组…...

AI小白必看:打好基础再冲大模型,收藏这份学习路线图!

本文针对想学习AI的学生&#xff0c;强调掌握基础的重要性&#xff0c;避免直接进入大模型学习。文章提出应先理解AI的核心是让机器从数据中学习规律&#xff0c;并掌握数学、编程和数据思维能力。建议从数据处理开始&#xff0c;熟悉Python及常用库&#xff0c;逐步学习机器学…...