JVM执行引擎

目录

(一)执行引擎概述

(二)Java代码编译和执行过程

(三)机器码,指令,汇编语言,字节码

1、机器码

2、指令

3、指令集

4、汇编

5、字节码

(四)解释器

(五)JIT编译器

(六)为什么两条腿走路

(七)概念解释

(八)什么时候选择JIT

(九)hotspot可以设置程序执行的方式

(十)hotspot中JIT分类


(一)执行引擎概述

执行引擎是Java虚拟机核心的组成部分之一。虚拟机的执行引擎由软件自行实现,物理机的执行引擎是操作系统层面上。执行引擎能够执行不被硬件直接支持的指令格式

执行引擎的工作过程

1、执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于PC寄存器。

2、每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址

3、当然方法在执行的过程中,执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在Java堆区中的对象实例信息,以及通过对象头中的元数据指针定位到目标对象的类型信息

(二)Java代码编译和执行过程

大部分的程序代码转换成物理机的目标代码或虚拟机能执行的指令集之前,都需要经过下图中的各个步骤

为什么说Java是半编译半解释型语言

因为JVM既有解释器也有编译器。JVM在执行Java代码的时候,通常会将解释执行与编译执行二者结合起来进行

(三)机器码,指令,汇编语言,字节码

1、机器码

各种采用二进制编码方式表示的指令,叫做机器指令码。机器语言。机器指令与CPU紧密相关,不同种类的CPU所对应的机器指令也就不同

2、指令

由于机器码由01组成,可读性太差。于是人们发明了指令

指令就是把机器码特定的0和1序列,简化成对应的指令,一般为英文编写如mov,inc等,可读性稍好

由于不同的硬件平台,执行同一个操作,对应的机器码可能不同。所以不同的硬件平台的同一种指令,对应的机器码也可能不同

3、指令集

不同硬件平台,各自支持的指令,是有差别的。因此每个平台所支持的指令,称之为对应平台的指令集

x86指令集,对应的x86架构的平台

ARM指令集,对应的是ARM架构的平台

4、汇编

由于指令的可读性太差,于是又有了汇编语言

汇编语言用助记符代替机器指令的操作码,用地址符号或标号,代替指令或操作数的地址。

汇编语言要翻译成机器指令码,计算机才能识别和执行

5、字节码

字节码是一种中间状态的二进制代码(文件),它比机器码更抽象,需要直译器转译后才能成为机器码

字节码主要为了实现特定文件运行和软件环境,与硬件环境无关

字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码。

特定平台上的虚拟机器将字节码转译为可以直接执行的指令

(四)解释器

当Java虚拟机启动时,会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译为平台的本地机器指令执行

解析器真正意义上所承担的角色就是一个运行时翻译者,将字节码文件中的内容翻译为对应的平台的本地机器指令执行

当一条字节码指令被解释执行完成后,接着在根据PC寄存器中的记录下一条需要被执行的字节码执行解释执行

现在普遍使用的模板解释器是将每一条字节码和一个模板函数相关联,模板函数直接产生这条字节码执行时的机器码,提高解释器的性能

HotSpot中

  • Interpreter模块
    • 实现了解释器的核心功能
  • Code模块
    • 用于管理HotSpot在运行时生成的本地机器指令

(五)JIT编译器

就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言

JVM平台支持一种叫做即时编译的技术,目的是避免解释执行,而是将整个函数体编译成机器码,每次函数执行时,只执行编译后的机器码即可。使执行效率大幅提升

(六)为什么两条腿走路

即为什么hotspot即有解释器又有编译器?

首先程序启动后,解释器可以马上发挥作用,省去编译时间,立即执行

编译器要想发挥作用,把代码编译成本地代码,需要一定的执行时间。但编译为本地代码后执行效率更高

对于服务端应用,启动时间并非关注重点,但是对于看重启动时间的应用场景,就需要找到一个平衡点。

当Java虚拟机启动时,解释器可以首先发挥作用,而不是等待即时编译器全部编译完成后再执行,这样可以省去很多不必要的编译时间,随着时间的推移,编译器发挥作用,把越来越多的代码编译成本地代码,获得更高的执行效率

(七)概念解释

  • 前端编译器
    • 把.java文件转换为.class文件的过程
      • sun的Javac,
  • 后端运行期编译器
    • 把字节码转为机器码的过程
      • JIT编译器:hotSpot的C1,C2编译器
  • 静态提前编译器
    • Ahead of Time Compliler AOT,直接把.java文件编译器本地机器代码的过程
      • GNU Compiler for the Java(GCJ)

(八)什么时候选择JIT

需要根据代码被调用执行的频率而定,需要被编译为本地代码的字节码,也称之为热点代码

JIT编译器会在运行时针对频繁调用的热点代码做出深度优化,将其直接编译为对应平台的本地机器指令。以此提升Java程序的执行性能

一个被多次调用的方法,或者方法体内部循环次数较多的循环体,都可以被称之为热点代码

因此可以通过JIT编译器编译为本地机器指令,由于这种编译方法发生在方法的执行过程中,因此也被称之为栈上替换,OSR On Statck Replacement

那么一个方法调用都少次才能达到标准?这个需要依靠热点探测功能

hotspot采用的基于计数器的热点探测。方法计数器和回边计数器

1、方法调用计数器

  • 统计方法调用次数,当一个方法被调用时,如果不存在已被编译过的版本,则将此方法的调用计数器+1,然后判断方法调用计数器与回边计数器之和,是否超过方法调用计数器的阈值。如果已经超过,会向即时编译器提交一个该方法的代码编译请求。
  • 默认阈值,Client模式下是1500次,Server模式下是10000次
  • -XX:CompileThreshold

2、统计循环体执行的循环次数

3、热度衰减

当超过一定的时间限度,如果方法调用次数仍然不足以提交即时编译器编译,那么这个方法的调用计数器就会被减少一半。

-XX:UseCounterHalfLifeTime参数设置半衰周期的时间,单位是秒

(九)hotspot可以设置程序执行的方式

-Xint:完全采用解释器模式执行

-Xcomp完全采用即时编译器模式执行,如果即时编译器出现问题,解释器会介入执行

-Xmixed采用解释器+即时编译器的混合模式共同执行(默认)

(十)hotspot中JIT分类

hotspot中内置两个JIT编译器,分别是client 和 server

大多情况下简称C1,C2

  • -client:指定Java虚拟机在Client模式下,并使用C1编译器
    • C1编译器会对字节码进行简单和可靠的优化,耗时短,以达到更快的编译速度
      • 方法内联:将引用的函数代码编译到引用点处,减少栈帧的生成,减少参数传递以及跳转过程
      • 去虚拟化:对唯一的实现类进行内联
      • 冗余消除:在运行期把一些不会执行的代码折叠掉
  • -server:指定虚拟机在server模式下,并使用C2编译器
    • C2进行耗时较长的优化,以及激进优化,单优化后的代码执行效率更高
      • 逃逸分析是优化的基础,基于逃逸分析在C2上有几种优化
        • 标量替换:用标量值代替聚合对象的属性值
        • 栈上分配:对于未逃逸的对象分配在栈而不是堆
        • 同步消除:清除同步操作,通常指synchronized

总结:

一般来讲,JIT编译出来的机器码性能比解释器高;C2编译器启动时长比C1编译器慢,系统稳定执行以后,C2编译器执行速度远远快于C1编译器。

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

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

相关文章

在Visual Studio Code中安装加速TypeScript程序开发的插件

在Visual Studio Code中安装加速TypeScript程序开发的插件 Install Extensions on Visual Studio Code for TypeScript Application Development By Jackson 2023-11-28 众所周知,微软的Visual Studio Code是一款轻量级、功能强大的集成开发环境。它支持各种编程语…

linux CentOS MobaXterm 通过X11 Forwarding 在本地开启图形可视化窗口

第一步 操作系统安装图形界面 X11 Forwarding dnf install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xclock第二步 修改参数,启用X11 Forwarding vim /etc/ssh/sshd_config修改参数X11Forwarding yes和X11UseLocalhost no #Al…

AIGC系列之:GroundingDNIO原理解读及在Stable Diffusion中使用

目录 1.前言 2.方法概括 3.算法介绍 3.1图像-文本特征提取与增强 3.2基于文本引导的目标检测 3.3跨模态解码器 3.4文本prompt特征提取 4.应用场景 4.1结合生成模型完成目标区域生成 4.2结合stable diffusion完成图像编辑 4.3结合分割模型完成任意图像分割 1.前言 …

Docker容器常用命令

文章目录 启动类命令帮助类命令镜像命令列出本地主机上的镜像在远程仓库中搜索镜像下载镜像保存镜像加载 tar 包为镜像查看占据的空间删除镜像 虚悬镜像命令自动补全新建启动容器启动交互式容器启动守护式容器 列出正在运行的容器容器其他启停操作启动已经停止的容器重启容器停…

c++|类与对象(中)

目录 一、类的6个默认成员函数 二、构造函数 2.1概念 2.2七大特性 三、析构函数 3.1概念 3.2特性 四、拷贝构造函数 4.1概念 4.2特性 五、赋值运算符重载 5.1运算符重载 5.2赋值运算符重载 5.3前置和后置重载 六、const成员函数 七、取地址及const取地址操作符重…

【算法】算法题-20231129

这里写目录标题 一、15. 三数之和二、205. 同构字符串三、383. 赎金信 一、15. 三数之和 提示 中等 6.5K 相关企业 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] …

Redis中的缓存穿透、雪崩、击穿(详细)

目录 一、概念 1. 缓存穿透(Cache Penetration) 解决方案: 2. 缓存雪崩(Cache Avalanche) 解决方案: 3. 缓存击穿(Cache Breakdown) 解决方案: 二、三者出现的根本原…

中英双语大模型ChatGLM论文阅读笔记

论文传送门: [1] GLM: General Language Model Pretraining with Autoregressive Blank Infilling [2] Glm-130b: An open bilingual pre-trained model Github链接: THUDM/ChatGLM-6B 目录 笔记AbstractIntroductionThe design choices of GLM-130BThe …

Mac苹果视频剪辑:Final Cut Pro Mac

Final Cut Pro是一款由Apple公司开发的专业视频非线性编辑软件,是业界著名的视频剪辑软件之一。它最初发布于1999年,是Mac电脑上的一款独占软件。Final Cut Pro具有先进的剪辑工具、丰富的特效和颜色分级、音频处理等功能,使得用户可以轻松地…

elasticsearch 实战

文章目录 项目介绍导入项目 Elasticsearch Java API 查询文档快速入门发起查询请求解析响应完整代码 match查询精确查询布尔查询排序、分页高亮高亮请求构建高亮结果解析 项目介绍 本项目是一个由spring boot 3.0.2在gradle 8.4和java 21的环境下搭建的elasticsearch项目demo&…

JSP forEach 标签遍历map集合

之前我们说了 普通list 单纯按数量循环 bean类型list的遍历方式 那么 我们forEach标签 也能循环map语法非常简单&#xff0c;和循环list基本是一样的 我们直接上jsp代码 <% page import"java.util.Map" %> <% page import"java.util.HashMap" %…

JAVA基础进阶(十)

一、File类常用的API File类的对象可以用来表示文件或者文件夹,下面是File类常用的API。 1.1、File类判断文件类型、获取文件信息功能 代码中的体现: 1.2、File类的创建和删除方法 代码中的体现: 1.3、文件夹遍历方法 代码中的体现: 二、字符集 字符集&#xff08;Character…

C#常用运算符的优先级

前言 运算符在C#编程语言中扮演着重要的角色&#xff0c;用于执行各种计算和操作。了解运算符的优先级是编写高效和正确代码的关键。本文将深入探讨C#中38个常用运算符的优先级划分和理解&#xff0c;并提供详细的说明和示例&#xff0c;以帮助读者更好地理解运算符的使用。 目…

Stable Video Diffusion重磅发布:基于稳定扩散模型的AI生成视频

最近&#xff0c;stability.ai发布了稳定视频扩散&#xff0c;这是stability.ai第一个基于图像模型稳定扩散的生成视频基础模型。现在可以在研究预览中看到&#xff0c;这个最先进的生成人工智能视频模型代表着stability.ai在为每种类型的人创建模型的过程中迈出了重要的一步。…

FFA 2023|字节跳动 7 项议题入选

Flink Forward 是由 Apache 官方授权的 Apache Flink 社区官方技术大会&#xff0c;作为最受 Apache Flink 社区开发者期盼的年度峰会之一&#xff0c;FFA 2023 将持续集结行业最佳实践以及 Flink 最新技术动态&#xff0c;是中国 Flink 开发者和使用者不可错过的的技术盛宴。 …

中小型工厂如何进行数字化转型

随着科技的快速发展和市场竞争的日益激烈&#xff0c;中小型工厂面临着诸多挑战。为了提高生产效率、降低成本、优化资源配置&#xff0c;数字化转型已成为中小型工厂发展的必经之路。中小型工厂如何进行数字化转型呢&#xff1f; 一、明确数字化转型目标 在进行数字化转型之前…

怎么把dwg格式转换pdf?

怎么把dwg格式转换pdf&#xff1f;DWG是一种由AutoCAD开发的二维和三维计算机辅助设计&#xff08;CAD&#xff09;文件格式&#xff0c;它的名称是“绘图&#xff08;Drawing&#xff09;”的缩写。DWG文件通常包含了设计图纸、模型和元数据等信息&#xff0c;并且被广泛用于工…

Pytorch:torch.utils.data.DataLoader()

如果读者正在从事深度学习的项目&#xff0c;通常大部分时间都花在了处理数据上&#xff0c;而不是神经网络上。因为数据就像是网络的燃料&#xff1a;它越合适&#xff0c;结果就越快、越准确&#xff01;神经网络表现不佳的主要原因之一可能是由于数据不佳或理解不足。因此&a…

接口01-Java

接口-Java 一、引入(快速入门案例)二、接口介绍1、概念2、语法 三、应用场景四、接口使用注意事项五、练习题1 一、引入(快速入门案例) usb插槽就是现实中的接口。 你可以把手机、相机、u盘都插在usb插槽上&#xff0c;而不用担心那个插槽是专门插哪个的&#xff0c;原因是做u…

解决git action发布失败报错:Error: Resource not accessible by integration

现象&#xff1a; 网上说的解决方法都是什么到github个人中心setting里面的action设置里面去找。 可这玩意根本就没有&#xff01; 正确解决办法&#xff1a; 在你的仓库页面&#xff0c;注意是仓库页面的setting里面&#xff1a; Actions> General>Workflow permisss…