JVM原理(十七):JVM虚拟机即时编译器详解

news2025/2/23 19:27:35

编译器无论在何时、在何种状态下把Class文件转换成与本地基础设施相关的二进制机器码,他都可以视为整个编译过程的后端。

后端编译器编译性能的好坏、代码优化质量的高低却是衡量一款商用虛拟机优秀与否的关键指标之一。

1. 即时编译器

即时编译器是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序。

目前主流的两款商用Java虚拟机(HotSpot、 OpenJ9)里,Java程序最初都是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”(Hot Spot Code),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成本地机器码,并以各种手段尽可能地进行代码优化,运行时完成这个任务的后端编译器被称为即时编译器

1.1. 解释器与编译器

尽管并不是所有的Java虛拟机都采用解释器与编译器并存的运行架构,但目前主流的商用Java虚拟机,譬如HotSpot、OpenJ9等, 内部都同时包含解释器与编译器],解释器与编译器两者各有优势:当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即运行。当程序启动后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码,这样可以减少解释器的中间损耗,获得更高的执行效率

当程序运行环境中内存资源限制较大,可以使用解释执行节约内存(如部分嵌入式系统中和大部分的JavaCard应用中就只有解释器的存在),反之可以使用编译执行来提升效率。

1.2. 编译对象与触发条件

被判断为“热点代码”的标准:

  1. 被多次调用的方法。

  2. 被多次执行的循环体。

被多次调用的方法:前者很好理解,一个方法被调用得多了,方法体内代码执行的次数自然就多,它成为“热点代码”是理所当然的。

被多次执行的循环体:为了解决当一个方法只被调用过一次或少量的几次,但是方法体内部存在循环次数较多的循环体,这样循环体的代码也被重复执行多次,因此这些代码也应该认为是“热点代码”。

即时编译被触发的条件

热点探测:判断某段代码是不是热点代码,是不是需要触发即时编译。

目前主流的热点探测判断方式:

.基于采样的热点探测(SampleBasedHotSpotCodeDetection)。采用这种方法的虛拟机会周期性地检查各个线程的调用栈顶,如果发现某个(或某些)方法经常出现在栈项,那这个方法就是“热点方法”。基于采样的热点探测的好处是实现简单高效,还可以很容易地获取方法调用关系(将调用堆栈展开即可),缺点是很难精确地确认一个方法的热度,容易因为受到线程阻塞或别的外界因素的影响而扰乱热点探测。

.基于计数器的热点探测(Counter Based Hot Spot Code Detection) 。采用这种方法的虚拟机会为每个方法(甚至是代码块)建立计数器,统计方法的执行次数,如果执行次数超过一定的阈值就认为它是“热点方法”。这种统计方法实现起来要麻烦一些,需要为每个方法建立并维护计数器,而且不能直接获取到方法的调用关系。但是它的统计结果相对来说更加精确严谨。

HotSpot使用的是第二种基于计数器的热点探测,方法,为了实现热点计数,HotSpot为每个 方法准备了两类计数器:方法调用计数器( Invocation Counter)和回边计数器( Back Edge Counter),“回边”的意思就是指在循环边界往回跳转)。当虚拟机运行参数确定的前提下,这两个计数器都有一个明确的阈值,计数器阈值一旦溢出,就会触发即时编译

调用计数器的使用规则:当一个方法被调用时,虚拟机会先检查该方法是否存在被即时编译过的版本,如果存在,则优先使用编译后的本地代码来执行。如果不存在已被编译过的版本,则将该方法的调用计数器值加一,然后判断方法调用计数器与回边计数器值之和是否超过方法调用计数器的阈值。一旦已超过阈值的话,将会向即时编译器提交一个该方法的代码编译请求。

在默认设置下,方法调用计数器统计的并不是方法被调用的绝对次数,而是一个相对的执行频率,即一段时间之内方法被调用的次数。当超过一定的时间限度,如果方法的调用次数仍然不足以让它提交给即时编译器编译,那该方法的调用计数器就会被减少一半,这个过程被称为方法调用计数器热度的衰减(Counter Decay),而这段时间就称为此方法统计的半衰周期(Counter Half Life Time)。

回边计数器:它的作用是统计一个方法中循环体代码执行的次数,在字节码中遇到控制流向后跳转的指令就称为“回边”,目的:很显然,建立回边计数器统计的目的是为了触发栈上的替换编译

两者的不同之处

与方法计数器不同,回边计数器没有计数热度衰减的过程,因此这个计数器统计的就是该方法循环执行的绝对次数。当计数器溢出的时候,它还会把方法计数器的值也调整到溢出状态,这样下次再进入该方法的时候就会执行标准编译过程。

1.3. 编译过程

在默认条件下,无论是方法调用产生的标准编译请求,还是栈上替换编译请求,虚拟机在编译器还未完成编译之前,都任然将按照解释方式继续执行代码,而编译动作则在后台的编译线程中进行。


客户端的编译过程:

他是一个相对简单快速的三段式编译器,主要关注点在局部优化,而放弃许多耗时较长的全局优化手段。

  1. 一个平台独立的前端将字节码构造成一种高级中间代码表示。

  2. 一个平台相关的后端从HIR中产生低级中间代码表示。

  3. 最后阶段是在平台相关的后端使用线性扫描算法。

服务端编译器

而服务端编译器则是专门面向服务端的典型应用场景,并为服务端的性能配置针对性调整过的编译器,也是一个能容忍很高优化复杂度的高级编译器。

它会执行大部分经典的优化动作,如:无用代码消除( Dead Code Elimination)、循环展开(Loop Unrolling)、循环表达式外提(Loop Expression Hoisting)、消除公共子表达式(Common Subexpression Elimination)、常量传播(Constant Propagation)、基本块重排序( Basic Block Reordering)等,还会实施一些与Java语言特性密切相关的优化技术,如范围检查消除( Range Check Elimination)、空值检查消除(NullCheckElimination,不过并非所有的空值检查消除都是依赖编译器优化的,有一一些是代码运行过程中自动优化了)等。另外,还可能根据解释器或客户端编译器提供的性能监控信息,进行一些不稳定的预测性激进优化,如守护内联(GuardedInlining)、分支频率预测( Branch Frequency Prediction)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1902361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux安装达梦

文章目录 前言一、docker安装1.下载镜像2.导入镜像3.生成容器 二、ios安装1.环境准备2.iso安装3.配置实例4.注册服务5.启停服务 总结 前言 公司要求我将数据从oracle迁移到达梦数据库,这个国产数据库以前没用过,所以记录一下这次的安装过程。 一、docke…

基于PHP技术的在线校园美食攻略程序设计与实现

基于PHP技术的在线校园美食攻略程序设计与实现 摘 要 网络技术正在以空前持续的速度在改变着我们的生活。利用互联网技术,人们对网上食物共享越来越关注。基于此,本文利用 PHP技术,对网上大学饮食指南应用软件进行了研究。 整个系统的设计&a…

硕士文凭再耀眼,也没有第一学历刺眼?

在当今社会,教育被视为个人发展和社会进步的重要基石。随着高等教育的普及和竞争的加剧,学历成为了衡量个人能力、决定职业前景的重要标尺。然而,在这一过程中,“第一学历”的概念逐渐凸显,其影响力甚至在某些情况下超越了后续的硕士、博士等更高学历。这一现象引发了广泛…

14-31 剑和诗人5 - 使用 AirLLM 和分层推理在单个 4GB GPU 上运行 LLama 3 70B

利用分层推理实现大模型语言(LLM) 大型语言模型 (LLM) 领域最近取得了显著进展,LLaMa 3 70B 等模型突破了之前认为可能实现的极限。然而,这些模型的庞大规模给其部署和实际使用带来了巨大挑战,尤其是在资源受限的设备上,例如内存…

大模型的实践应用25-LLama3模型模型的架构原理,以及手把手教你搭建LLama3模型

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用25-LLama3模型模型的架构原理,以及手把手教你搭建LLama3模型。LLaMA 3 是Meta公司开发的最新一代大规模语言模型,其架构在很大程度上继承了LLaMA 2的设计,但对某些关键组件进行了改进和优化。 文章目录 一、LLama3模…

设计模式之单例模式(Java)

单例模式实现方式:懒汉式、饿汉式、双重检查、枚举、静态内部类; 懒汉式: /*** 懒汉式单例模式* author: 小手WA凉* create: 2024-07-06*/ public class LazySingleton implements Serializable {private static LazySingleton lazySinglet…

新手学Cocos报错 [Assets] Failed to open

两个都在偏好设置里面调(文件下面的偏好设置): 1.设置中文? 2.报错 [Assets] Failed to open? 这样在点击打开ts文件的时候就不会报错,并且用vscode编辑器打开了, 同样也可以改成你们自己喜欢…

2、图形验证码

1、图形验证码设计 1.1思路 现今,市面上的图形验证码付费的,免费的多种多样,主要形式有滑动拼图、文字点选、语序点选、字体识别、空间推理、智能随机等。 而处理也分为web端和sever端两部分 此处以免费的kaptcha 为例,进行数字图…

分支与循环(二)

目录 1.switch语句 1)switch语法形式 2)if语句和switch语句的对比 3) switch语句中的break 4) switch语句中的default 5) switch语句中的case和default的顺序问题 2.while循环 1) if 和 while的对比 2) while语句的执行流程​编辑 3)while循环的…

linux 基础命令、gcc的基础用法

1、ls——>列出目录下的内容 语法:ls [-a -l -h] [Linux路径] (1)-a -l -h 是可选的选项 (2)Linux路径是此命令的可选参数 ①当不使用选项和参数,直接使用 ls 命令本体,表示:…

图论·Day01

P3371 P4779 P3371 【模板】单源最短路径(弱化版) 注意的点: 边有重复,选择最小边!对于SPFA算法容易出现重大BUG,没有负权值的边时不要使用!!! 70分代码 朴素板dijsk…

【Web】

1、配仓库 [rootlocalhost yum.repos.d]# vi rpm.repo ##本地仓库标准写法 [baseos] namemiaoshubaseos baseurl/mnt/BaseOS gpgcheck0 [appstream] namemiaoshuappstream baseurlfile:///mnt/AppStream gpgcheck0 2、挂载 [rootlocalhost ~]mount /dev/sr0 /mnt mount: /m…

类与对像(1)

好几个月没有写了,差了好多,这些天补回来吧。 接下来,让我们正式步入C与C语言开始不同的地方。 我对类的理解:类是对于具有相同或相似属性的数据集合。 类的关键词:class,public,protected&a…

vue3中pinia使用持久化管理

安装插件 npm install pinia pinia-plugin-persistpinia进行注册 创建index.ts import { createPinia } from pinia; //对外暴露大仓库 export default createPinia(); 在mian.ts //引入pinpa import { createApp } from vue //引入根组件 import App from ./App.vue const…

昇思MindSpore学习入门-评价指标

当训练任务结束,常常需要评价函数(Metrics)来评估模型的好坏。不同的训练任务往往需要不同的Metrics函数。例如,对于二分类问题,常用的评价指标有precision(准确率)、recall(召回率&…

全网最详细的appium 自动化测试iOS(二)

一、环境准备: 1、安装appium 2、xcode (appium 版本:12.1.0 xcode版本:12.5 可正常运行,ps:appium 版本:12.1.0 xcode版本:13.0 一直报奇奇怪怪的错误) 3、依赖工具包安装 brew install…

基于星火大模型的群聊对话分角色要素提取挑战赛

赛事任务与数据 2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn) 从给定的<客服>与<客户>的群聊对话中, 提取出指定的字段信息&#xff0c;待提取的全部字段见下数据说明。 赛题方提供了184条真实场景的群聊对话数据以及人工标注后的字段提取结果&#xf…

linux centos 安装niginx并且添加ssl(https)模块

文章目录 前言一、nginx安装教程1.流程步骤 总结 前言 一、nginx安装教程 1.流程步骤 代码如下&#xff08;示例&#xff09;&#xff1a; 1.先下载linux安装包 2.解压安装命令 sudo tar -zxvf nginx-1.20.1.tar.gz3.进入解压后的目录 sudo cd nginx-1.20.14.安装 sudo y…

opencv环境搭建-python

最近遇到了一些图像处理的需求&#xff0c;所以需要学习一下opencv,来记录一下我的学习历程。 安装numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy安装matplotlib pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib安装opencv …

CSS技巧:用CSS绘制超写实的酷炫徽章缎带效果,超漂亮,超酷炫

为什么要用CSS来画个徽章&#xff1f;这货脑子进水了吧&#xff01; 今天在电脑前设计&#xff0c;要做徽章效果。突然觉得可以尝试用css实现近似的效果。说干就干&#xff0c;打开编辑器&#xff0c;让我的手指头活跃起来&#xff01; 技术要点 通过多个圆形嵌套和渐变属性…