【JVM详解四】执行引擎

一、概述

Java程序运行时,JVM会加载.class字节码文件,但是字节码并不能直接运行在操作系统之上,而JVM中的执行引擎就是负责将字节码转化为对应平台的机器码让CPU运行的组件。

执行引擎是JVM核心的组成部分之一。可以把JVM架构分成三部分,如下图所示:

 执行引擎位于JVM的最下层(图中虚线框部分),可以粗略地看到执行引擎负责和运行时数据区交互。

二、计算机语言的发展史

在讲解执行引擎之前,需要知道什么是机器码、汇编语言、高级语言以及为什么会有Java字节码的出现。

2.1 机器码

各种用 0 和 1 组成的二进制编码方式表示的指令,叫作机器指令码,简称机器码。

计算机发展的初始阶段,人们就用机器码编写程序,我们也称为机器语言。机器语言虽然能够被计算机理解和接受,但由于可读性差不便于人类读写,并且用它编程容易出差错。使用机器码编写的程序一经输入计算机,CPU可以直接读取运行,因此和其他语言编的程序相比,执行速度最快。机器码与CPU紧密相关,所以不同种类的CPU所对应的机器码也就不同。

2.2 汇编语言

由于机器码是由0和1组成的二进制序列,可读性实在太差,于是人们发明了指令。

指令就是把机器码中特定的0和1序列,简化成对应的指令(一般为英文简写,如mov、inc等),可读性稍好,这就是我们常说的汇编语言。在汇编语言中,用助记符 (Mnemonics) 代替机器码的操作码,用地址符号 (Symbol) 或标号 (Label) 代替指令或操作数的地址。

不同的硬件平台,各自支持的指令是有差别的。因此每个平台所支持的指令,称为对应平台的指令集,如常见的x86指令集对应的是x86架构的平台,ARM指令集对应的是ARM架构的平台。不同平台之间指令不可以直接移植。

由于计算机只认识机器码,所以用汇编语言编写的程序还必须经过汇编器转换为机器语言,计算机才能识别和执行。

2.3 高级语言

为了使计算机用户编程序更容易些,后来就出现了各种高级计算机语言。比如C、C++等更容易让人识别的语言。

高级语言则相对汇编语言更易于编写,有更好的可读性,一般编译器会将高级语言转换成汇编语言,然后再由汇编器转换为机器指令由计算机执行。

2.4 字节码

字节码是一种中间状态(中间码)的二进制代码(文件),需要转译后才能成为机器码。Java 程序可以通过编译器将源码编译成 Java 字节码,特定平台上的虚拟机将字节码转译为可以直接执行的指令,也就实现了跨平台性。如下图所示:

三、执行引擎工作过程

  1. 执行引擎在执行过程中,需要执行什么样的字节码指令取决于PC寄存器(程序计数器);
  2. 每执行完一项指令操作之后,PC寄存器会更新下一条需要执行的指令地址;
  3. 方法执行过程中,执行引擎可能会通过局部变量表中的对象引用准确定位到 Java 堆中的对象实例信息,以及通过对象头中的元数据信息定位到目标对象的类型信息。
Java执行引擎包括以下组成部分:
  • 解释器
  • JIT编译器
  • 垃圾收集器

3.1 解释器

解释器就是一个运行时的“翻译者”,将字节码指令翻译为对应平台的本地机器指令由CPU执行,当一条指令执行完成后再根据PC寄存器中记录的下一条指令执行解释操作。

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

3.2 JIT(Just-In-Time)编译器

当执行某些频繁被调用的代码(比如for循环中的代码)时,如果按照解释执行,效率非常低,这种被频繁调用的代码成为热点代码。为了提高热点代码的执行效率,在运行时,JIT编译器则会将这些代码编译成与本地平台有关的机器码,并进行各种层次的优化。

JIT的构成组件包括:

  • 中间代码生成器——生成中间代码
  • 代码优化器——优化中间代码
  • 目标代码生成器——生成机器码或本地代码
  • 分析器——负责查找热点代码

3.2.1 JIT编译器类型

在 Hotspot 虚拟机中内置了两种JIT编译器:

  • C1编译器:主要关注点在于局部性能优化,适用于执行时间短或对启动性能有要求的程序,如:GUI应用,C1编译器也被称为Client Compiler。
  • C2编译器:为长期运行的服务端应用程序做性能优化的编译器,适用于执行时间较长或对峰值性能有要求的程序,C2编译器也被称为Server Compiler。
Graal编译器:用Java实现的JIT编译器,JDK10中引入(具体信息参考: JEP 317: Experimental Java-Based JIT Compiler),JDK17中移除(移除原因参考: JEP 410: Remove the Experimental AOT and JIT Compiler)

3.2.2 分层编译

在 Java7 引入了分层编译,这种方式综合了 C1 的启动优势和 C2 的峰值性能优势。分层编译将 JVM 的执行状态分为5个层次:

  • 第0层:程序解释执行,默认开启性能监控(Profiling),如果不开启,可触发第二层编译
  • 第1层:C1编译,将字节码编译成本地代码,进行简单可靠的优化,不开启Profiling
  • 第2层:C1编译,开启Profiling,仅执行带方法调用次数和循环回边执行次数Profiling的C1编译
  • 第3层:C1编译,执行所有带Profiling的C1编译
  • 第4层:C2编译,将字节码编译为本地代码,但会启用一下编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。

Java8 中默认开启分层编译,-XX:-TieredCompilation 参数可关闭分层编译只使用C2编译,如果只使用C1编译可设置参数 -XX:TieredStopAtLevel=1。

-Xint参数可设置为强制解释器模式运行,-Xcomp可设置为强制运行JIT编译模式。

3.2.3 热点代码探测

Hotspot 虚拟机判定热点代码基于2种计数器进行,方法调用计数器和回边计数器,只有代码符合标准并达到设置的阈值才会进行JIT编译优化。

1)方法调用计数器

当某个方法调用次数达到阈值就会触发JIT编译优化。

jinfo -flag CompileThreshold 或者 java -XX:+PrintFlagsFinal -version 命令可查看方法调用次数阈值,客户端模式下默认值为1500,服务端模式下默认值为10000。

2)回边计数器

用于统计方法体中循环体代码执行次数,字节码中遇到控制流向后跳转的指令称为“回边”(Back Edge),用于计算是否为热点代码的阈值。

计算公式如下:

回边计数器阈值 = 方法调用计数器阈值(CompileThreshold)*(OSR比率(OnStackReplacePercentage)-解释器监控比例(InterpreterProfilePercentage))/ 100

java -XX:+PrintFlagsFinal -version 命令可查看相关参数

 根据图中显示的各参数的默认值可以计算出回边计数器阈值为:1000 * (140 - 33) = 10700

3.2.4 编译优化技术

1)方法内联

方法内联的优化行为是将目标方法的代码复制到发起调用的方法中,避免真实方法调用。

private int add(int a, int b, int c, int d) {return addInt1(a, b) + addInt2(c, d);
}
​
private int addInt1(int a, int b) {return a + b;
}
​
private int addInt2(int a, int b) {return a + b;
}

例如上面的代码如果被检测为热点代码,则会被优化为以下代码:

private int add(int a, int b, int c, int d) {return a + b + c + d;
}

热点方法不一定都会被内联优化,只有当方法体大小小于参数 -XX:FreqInlineSize 值(默认325字节)才会进行内联,非热点方法当方法体小于参数 -XX:MaxInlineSize 值(默认35字节)才会进行内联。

相关性能调优 :

  • 减小热点方法检测阈值,增加内联方法体阈值,缺点则是会增加内存占用
  • 尽量避免在一个方法体内写入大量代码,习惯使用小方法体
  • 尽量使用final private static 关键字修饰方法,代码优化时,因为继承需要额外的类型检查。

2)锁消除

当方法中的局部方法中创建的对象只能被当前线程访问时,不存在锁竞争,JIT编译会对这个对象的方法进行锁消除。

参数 -XX:+EliminateLocks 可以开启锁消除(默认开启),-XX:-EliminateLocks 则是关闭锁消除。

3)锁粗化

如果检测到同一个对象执行了连续的加锁和解锁操作,则会将这一系列操作合并成一个更大的锁,从而提升程序运行效率。

4)逃逸分析

JIT编译器会对热点代码中的对象进行逃逸分析,分析该对象动态作用域,当被传递到其他方法中称为方法逃逸,当能被外部方法所引用则为线程逃逸

不逃逸 到 方法逃逸 再到 线程逃逸,逃逸程度由低到高。

逃逸分析可以通过参数 -XX:+DoEscapeAnalysis开启(jdk1.8默认开启),或 -XX:-DoEscapeAnalysis 关闭。

关闭逃逸分析会导致对象分配到堆中,频繁触发垃圾回收导致代码运行慢。

5)标量替换

当确定对象不会逃逸出线程之外,该对象则会被分配到栈上,对象分配到栈需要进行成员变量拆分,这种优化技术叫做标量替换。标量替换需要开启逃逸分析。

标量替换可以通过参数 -XX:+EliminateAllocations开启(jdk1.8默认开启),或-XX:+EliminateAllocations关闭

3.3 垃圾收集器

Java的一个主要特点就是开发人员不需要过分关注对象的内存管理,无用对象的销毁和空间释放都交由JVM的垃圾收集器处理。这减轻了编程负担提高了编程效率,但垃圾回收也会影响程序的性能。

详细介绍见上章。

四、总结

JVM中的执行引擎是JVM的重要组成部分之一,主要负责将字节码指令翻译成机器码指令。

执行引擎包括解释器,JIT解释器和垃圾收集器。

解释器就是运行时的“翻译者”,将字节码解释为机器指令。

但是某些频繁执行的热点代码依然采用解释执行的话会导致程序执行很慢,JIT编译器则是负责将热点代码编译分层优化成本地机器码。

垃圾收集器则负责无用对象的销毁,释放内存空间。

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

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

相关文章

mysql安装starting the server报错

win10家庭版无法启动服务的,先不要退出,返回上一栏,然后通过电脑搜索栏输入服务两个字,在里面找到mysql80,右键属性-登录,登录身份切换为本地系统就行了

萬有的函數關係速成2. 連續和導數

1.討論間斷點類型 定义: 若函数在某点不满足连续的条件,则该点为间断点。 第一类间断点是左右极限都存在的间断点,其中左右极限相等的是可去间断点,不相等的是跳跃间断点; 第二类间断点是左右极限至少有一个不存在的间断点,包括无穷间断点(极限为无穷)和振荡间断点…

【专题】2025年我国机器人产业发展形势展望:人形机器人量产及商业化关键挑战报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p39668 机器人已广泛融入我们生活的方方面面。在工业领域,它们宛如不知疲倦的工匠,精准地完成打磨、焊接等精细工作,极大提升了生产效率和产品质量;在日常生活里,它们是贴心…

用docker在本地用open-webui部署网页版deepseek

前置条件 用Ollama在本地CMD窗口运行deepseek大模型-CSDN博客文章浏览阅读109次,点赞5次,收藏2次。首次运行需要下载deepseek的大模型包(大约5GB,根据本地网速的不同在半个小时到几个小时之间下载完成) ,并…

DeepSeek-R1 云环境搭建部署流程

DeepSeek横空出世,在国际AI圈备受关注,作为个人开发者,AI的应用可以有效地提高个人开发效率。除此之外,DeepSeek的思考过程、思考能力是开放的,这对我们对结果调优有很好的帮助效果。 DeepSeek是一个基于人工智能技术…

x小兔鲜vue.js

LayoutFooter.vue <template><footer class"app_footer"><!-- 联系我们 --><div class"contact"><div class"container"><dl><dt>客户服务</dt><dd><i class"iconfont icon-kef…

磁盘分区损坏:深度解析与数据恢复策略

一、磁盘分区损坏现象概述 磁盘分区损坏是计算机数据存储领域的一个常见问题&#xff0c;它通常表现为硬盘上的某个分区无法正常访问&#xff0c;数据读写失败&#xff0c;甚至整个分区消失。这种损坏可能源于多种因素&#xff0c;不仅影响用户的正常使用&#xff0c;更可能导…

Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)

一、网络 早期的计算机程序都是在本机上运行的&#xff0c;数据存储和处理都在同一台机器上完成。随着技术的发展&#xff0c;人 们开始有了让计算机之间相互通信的需求。例如安装在个人计算机上的计算器或记事本应用&#xff0c;其运行环 境仅限于个人计算机内部。这种设置虽然…

k8sollama部署deepseek-R1模型,内网无坑

这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…

机器学习基本概念(附代码)

这里的“机器”指的是计算机软硬件组织&#xff0c;而非传统的机械装置&#xff1b;而“学习”&#xff0c;则是指软件通过训练过程&#xff0c;其性能得以提升的过程。 一、算法与模型的关系 在机器学习领域&#xff0c;算法和模型是两个核心概念。算法是一种偏抽象的概念&a…

白嫖RTX 4090?Stable Diffusion:如何给线稿人物快速上色?

大家都知道&#xff0c;在设计的初期&#xff0c;我们通常会先绘制草图&#xff0c;然后再进行上色处理&#xff0c;最终才开始进行最终的设计工作。在这个上色的过程中&#xff0c;配色是至关重要的一环。这不仅方便了内部同事的评审&#xff0c;也让产品方和客户可以直观地了…

Win10环境使用ChatBox集成Deep Seek解锁更多玩法

Win10环境使用ChatBox集成Deep Seek解锁更多玩法 前言 之前部署了14b的Deep Seek小模型&#xff0c;已经验证了命令行及接口方式的可行性。但是纯命令行或者PostMan方式调用接口显然不是那么友好&#xff1a; https://lizhiyong.blog.csdn.net/article/details/145505686 纯…

kafka服务端之日志磁盘存储

文章目录 页缓存顺序写零拷贝 Kafka依赖于文件系统&#xff08;更底层地来说就是磁盘&#xff09;来存储和缓存消息 。 那么kafka是如何让自身在使用磁盘存储的情况下达到高性能的&#xff1f;接下来主要从3各方面详细解说。 页缓存 页缓存是操作系统实现的一种主要的磁盘缓存…

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系

韶音科技&#xff1a;消费电子行业售后服务实现数字化转型&#xff0c;重塑客户服务体系 在当今这个科技日新月异的时代&#xff0c;企业之间的竞争早已超越了单纯的产品质量比拼&#xff0c;**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…

使用 CloudDM 和钉钉流程化管理数据库变更审批

CloudDM 是一个专为团队协同工作打造的数据库数据管控平台。在管控数据库安全变更的过程中&#xff0c;为提高效率&#xff0c;CloudDM 接入了钉钉&#xff0c;支持实时通知与移动办公&#xff0c;满足广大企业用户的实际需求。 本文将介绍如何使用 CloudDM 和钉钉实现高效的数…

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是将DeepSeek功能集成到WPS中的详细步骤&#xff0c;无需本地部署模型&#xff0c;直接通过官网连接使用&#xff1a;1. 下载并安装OfficeAI插件 &#xff08;1&#xff09;访问OfficeAI插件下载地址&#xff1a;OfficeAI助手 - 免费办公智能AI助手, AI写作&#xff0c;下载…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<7>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 今天我们一起来学习转移表&#xff0c;回调函数&#xff0c;qsort… 目录 一、转移表1.1 定义与原理1.3…

漏洞分析 Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美国威睿&#xff08;VMware&#xff09;公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 近期&#xff0c;监测到Spring Framework在特定条件下&#xff0c;存在目录遍历漏洞&#xff08;网宿评分&am…

笔记:理解借贷相等的公式

强烈推荐非会计人士&#xff0c;快速了解会计看这个系列的视频&#xff0c;其中比较烧脑的“借贷相等”公式&#xff0c;这个视频讲解的不错&#xff1a; 4.小白财务入门-借贷记账法_哔哩哔哩_bilibili 比如这里&#xff0c;钱在银行卡重&#xff0c;所以银行存款就是借方…