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编译器。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一、Oceanbase基础

一、集群相关概念 集群:整个分布式数据库。Region:表示区域,是地域的逻辑概念,如1个城市,1个集群可以有多个Region,用于跨城市远 距离容灾。Zone:表示分区,是机房或机架的逻辑概念…

深度学习【二】

1.运行时错误 1.1 ModuleNotFoundError: No module named ‘torch_scatter’ 参考 https://blog.csdn.net/weixin_42421914/article/details/132875571 pip install --no-index torch-scatter -f https://pytorch-geometric.com/whl/torch-1.13.1%2Bcpu.html

某思路等考通一级MSOffice的分析

看到有朋友寻求2021版的等级考试一级软件,秉承授人以鱼不如授人以渔的理念,特写这个帖子。 某思路等考通一级MSOffice,版本6.5。 用到的软件,ScanId,de4dot,dnSpy。 第一步:分析 软件启动后有在线激活提示&…

华为云CDN刷新与查询余量的Go实现及在Jenkins中的部署

引言 在华为云上,对CDN缓存内容进行刷新是一个常见的需求,以确保最新的内容能尽快被用户访问到。通过使用Go语言,我们可以开发一个自动化的工具来实现这一需求,并将其集成到Jenkins中以实现持续部署。下面我们将分步骤讲解如何实…

MySQL递归查询:洞悉数据的层层关联

在处理关系型数据库时,我们经常会遇到这样的情况:某些数据之间存在层级关系,例如目录、组织结构、评论等。在这些场景下,我们需要一种灵活的查询技术来处理这种层级关系。今天我们就来探讨MySQL中的递归查询,体验其独特…

ThinkPHP6学生选课管理系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6学生选课管理系统 一 介绍 此学生选课管理系统基于ThinkPHP6框架开发,数据库mysql8,前端bootstrap。系统角色分为学生,教师和管理员。学生登录后可进行选课,教师登录后可查看选课情况…

Android : 获取、添加、手机联系人-ContentResolver简单应用

示例图: MainActivity.java package com.example.mygetdata;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;import android.Mani…

图书管理系统源码,图书管理系统开发,图书借阅系统源码四TuShuManager应用程序MVC视图View

Asp.net web应用程序MVC之View视图 .ASP.NET MVC页面也就是要说的视图基本被放在Views文件夹下; 2.利用APS.NET MVC模板生成框架,Views文件夹下的默认页面为.cshtml页面; 3.ASP.NET MVC默认页面为Razor格式的页面,因此默认页面为.…

三、Lua变量

文章目录 一、变量分类二、变量赋值三、索引 一、变量分类 lua变量分为全局变量,局部变量。 全局变量:默认,全局有效。 局部变量:从作用范围开始到作用范围结束,需加local 修饰。 a1function ff()local b1 endprint(a…

spring boot的redis连接数过多导致redis服务器压力过大的一次问题排查

一、背景 在今天上午的时候,突然收到大量的sentry报错,都是关于redis连接超时的警告。 首先想到的是去查看redis的监控,发现那个时间段,redis的请求数剧增,cpu使用率和带宽都陡增双倍。 下面的是redis监控的cpu情况 …

Module build failed: Error: ENOENT: no such file or directory

前言 这个错误通常发生在Node.js 和 vue,js项目中,当你试图访问一个不存在的文件或目录时。在大多数情况下,这是因为你的代码试图打开一个不存在的文件,或者你的构建系统(例如Webpack)需要一个配置文件,但找…

程序员为什么要一直坚持写博客

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 今天的文章其实说和技术有关系也没有什么问题,算起来我日更文章已经快四个月了,从最初的…

四、Lua循环

文章目录 一、while(循环条件)二、for(一)数值for(二)泛型for(三)repeat util 既然同为编程语言,那么控制逻辑里的循环就不能缺少,它可以帮助我们实现有规律的重复操作,而…

洗地机应该怎么选?希亦、必胜、米博、添可、小米洗地机实测推荐

作为一个常年测评智能家居的博主,关于洗地机的测评使用这些年也积累了不少的体验感受。以至于常被周边的朋友问到,洗地机到底是不是真的好用?洗地机有什么优点吗?选购的时候应该怎么选呢?洗地机什么牌子比较好呢&#…

.NET6实现破解Modbus poll点表配置文件

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 Modbus 协议是工控领域常见…

Elasticsearch:什么是非结构化数据?

非结构化数据定义 非结构化数据是指未按照设计的模型或结构组织的数据。 非结构化数据通常被归类为定性数据,可以是人类或机器生成的。 非结构化数据是最丰富的可用数据类型,经过分析后,可用于指导业务决策并在许多其他用例中实现业务目标。…

2015年五一杯数学建模B题空气污染问题研究解题全过程文档及程序

2015年五一杯数学建模 B题 空气污染问题研究 原题再现 近十年来,我国 GDP 持续快速增长,但经济增长模式相对传统落后,对生态平衡和自然环境造成一定的破坏,空气污染的弊病日益突出,特别是日益加重的雾霾天气已经干扰…

Node.js入门指南(五)

目录 MongoDB 介绍 下载与启动 命令行交互 Mongoose 代码模块化 图形化管理工具 hello,大家好!上一篇文章我们介绍了express框架,这一篇文字主要介绍MongoDB。来对数据进行存储以及操作。 MongoDB 介绍 各位小伙伴应该多多少少都有接…

JMeter---BeanShell实现接口前置和后置操作

在JMeter中,可以使用BeanShell脚本来实现接口的前置和后置操作。 下面是使用BeanShell脚本实现接口前置和后置操作的步骤: 1、在测试计划中添加一个BeanShell前置处理器或后置处理器。 右键点击需要添加前置或后置操作的接口请求,选择&quo…