JVM系列(八) -运行期的几种优化技术

news2024/11/12 16:01:38

一、摘要

在之前的文章中我们谈到过,相比 C/C++ 语言,Java 语言在运行效率方面要稍逊一些,因为 Java 应用程序是在虚拟机上运行,而 C/C++ 程序是直接编译成平台相应的机器码来运行程序。

从虚拟机对外发布开始,开发团队一直在努力试图缩小 Java 与 C/C++ 语言在运行效率上的差距。从实际的结果来看,确实成果显著。

本文就来聊聊 HotSpot 虚拟机为了提升 Java 程序的执行效率,都实现了哪些激动人心的优化技术。

二、JIT 编译器的引入

JIT 编译器,也称为即时编译器,它是 JVM 的重要组成部分。与我们经常用的生成 Java 字节码的javac编译器不同,JIT 编译器是实现 Java 程序执行效率提升的核心利器。

经常有面试官会提出这样的一个问题:Java 程序是解释执行还是编译执行?

刚开始学习 Java 的同学,大概率会认为 Java 是编译执行,其执行流程类似于如下图。

源码程序.java文件,通过javac命令编译成.class字节码,最后通过java命令在虚拟机中利用解释器来执行代码。其中虚拟机的解释器作用,就是将字节码的操作指令和真正的平台体系之间的指令建立映射,比如把 Java 的load指令转换成native codeload指令,以此来完成程序的执行。

其实,准确的说,Java 既有解释执行,也有编译执行,其工作流程大致可以用如下图来描述。

其中,JIT 编译器会将热点代码编译成本地平台相关的机器码,并进行各种层次的优化,从而实现程序执行效率的提升

JIT 编译器的出现,可以说补强了虚拟机边运行边解释的低性能问题。

也许有的同学会提出这样的疑问,既然引入了 JIT 编译器可以显著提升程序执行效率,那 HotSpot 为什么不直接采用 JIT 编译器来执行呢?

简单的说,解释器和编译器各有优势。

  • 当程序需要迅速启动和执行时,解释器可以首先发挥作用,省去编译的时间,可以立即执行
  • 当程序运行后,随着时间的推移,JIT 编译器可以发挥作用,能把越来越多的代码编译成本地机器码,进一步提升程序的执行效率

这就是为什么 Java 程序既有解释执行,也有编译执行的原因

当然,能触发即时编译请求的条件比较多,比如方法调用,OSR 编译请求等。在默认设置下,无论是哪种场景,虚拟机在代码编译器还未完成的时候,都仍然按照解释器来继续执行,而编译动作则是在后台的编译线程中运行。

用户可以通过-XX:-BackgroundCompilation参数来禁止后台编译,此时所有的编译请求会等待,直到编译完成后再开始执行本地机器码。

2.1、Client 模式与 Server 模式

在 HotSpot 虚拟机中内置了两款即时编译器,分别是Client CompilerServer Compiler,也称为 C1 编译器与 C2 编译器。

在目前的 HotSpot 虚拟机中,默认采用的是解释器与其中一个即时编译器直接配合的工作方式,用户也可以使用-client或者-server参数来指定解释器与具体的某个编译器配合工作。

它们之间的区别,可以用如下内容简要概括:

  • Client Compiler(C1编译器):它是一个简单快速的编译器,主要关注点在于局部性的优化,而放弃了许多耗时间长的全局优化手段
  • Sever Compiler(C2编译器):它是专门面向服务端的典型应用并为服务端的性能配置特别调整过的编译器,它会执行所有经典的优化动作,如无用代码消除、循环展开、常量传播、基本块重排序等,还会实施一些与 Java 语言特性密切相关的优化技术,如范围检查消除、空值检查消除等,另外,还有可能根据解释器或 Client Compiler 提供的性能监控信息,进行一些不稳定的激进优化,如守护内联、分支频率预测等

Sever Compiler 即时编译器,无疑是比较缓慢的,但它的编译速度依然远超传统的静态优化编译器,而且它相对于 Client Compiler 编译器输出的代码质量更高,可以减少本地代码的执行时间,从而抵消额外的编译时间开销,因此很多非服务端的虚拟机选择-server模式来运行。

2.2、编译对象与触发条件

在上文我们有提到,JIT 编译器会将热点代码编译成本地平台相关的机器码。

哪些代码会被 JIT 编译器判断为“热点代码”呢?主要有两类:

  • 被多次调用的方法
  • 被多次执行的循环体

这两种情况都会使即时编译器以整个方法作为编译对象。

比较难以理解的可能是第二种情况,对于被多次执行的循环体,可以理解成以一个方法可能只被调用一次或者少量的几次,但是方法体内部存在循环次数较多的循环体问题,这样循环体的代码也会被重复执行多次,因此这些代码也被认为是“热点代码”。

上面提到的都是概念知识,虚拟机如何判断一段代码是否是“热点代码”呢?主要有两种办法:

  • 基于采样的热点探测
  • 基于计数器的热点探测

HotSpot 虚拟机中使用的是第二种基于计数器的热点探测方法,它为每个方法准备了两类计数器:方法调用计数器和回边计数器。

在确认虚拟机运行参数的前提下,这两类计数器都有一个确认的的阀值,当计数器超过阀值时,就会触发即时编译器。

下面我们一起来看看这两类计数器的实现。

2.2.1、方法调用计数器

方法调用计数器,通常用于统计方法被调用的次数。它的默认阈值在Client模式下是 1500 次,在Server模式下是 10000 次,这个阈值可以通过-XX:CompileThreshold参数来人为设定。

当一个方法被调用

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

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

相关文章

去除视频水印字幕从未如此简单!4款神器助你轻松搞定!

文章介绍的四款工具都已经打包好了,文末关注公众号AIshape 回复 “视频去水印” 获取 我们平时在各大视频网站下载的视频一般都会带有平台的logo水印,像Runway、Pika、即梦、可灵等AI视频生成平台创作的视频素材,非会员下载会带有水印 想利用这些视频素材进行二次创作很不方…

glsl着色器学习 (十二)平移

平移和旋转、缩放是一样的,替换成平移矩阵即可; // 创建一个单位矩阵 const translateYMatrix mat4.create();// 沿着Y轴向下平移1个单位 mat4.fromTranslation(translateYMatrix, [0, -1, 0]);// 设置矩阵 gl.uniformMatrix4fv(matrixUniformLocation…

Maven学习与使用

内容概要 Maven是什么,有什么作用会配置Maven的环境,以及在idea上配置(重点)掌握Maven的工程结构掌握Maven的几个重要指令。(clean compile package install)掌握如何导包及依赖冲突解决办法 1 Maven 1.…

超详细!!!最新的VuePress + Github Pages + Github Actions实现博客自动部署

超详细!!!VuePress Github Pages Github Actions实现博客自动部署 本文着重讲述如何使用通过Github Actions将VuePress项目部署自动在Github Pages上。每一位开发者有一个自己的博客网站是一件很酷的事情,由于最近想整理一下在…

SpringBoot学习(8)(Bean注册条件)(@Conditional的衍生注解)

目录 一、引言 二、案例引用(接着上篇博客) 三、注册条件 (1)ConditionalOnProperty (2)Conditional0nMissingBean (3)ConditionalOnclass 四、总结 一、引言 之前学习和了解了Bean对…

相亲交友系统商业开发

在快节奏的现代生活中,寻找真爱成为了许多人的渴望。相亲交友系统,作为连接心灵的桥梁,正逐渐成为人们寻找伴侣的首选方式。我们的团队h17711347205致力于开发一款创新的相亲交友系统,旨在通过智能化的匹配算法,为用户…

出门总是一身猫毛怎么办?霍尼韦尔、希喂、352、小米宠物空气净化器对比实测

毕业了好些年,前段时间有同学组织了聚会,聚一聚,我们班的专业本身就和动物有关,聊天自然而然聊到了宠物上去,有个同学打趣:“有没有养猫狗看看衣服就知道了”。还真是家里养了宠物的,无论咋清理…

电子商务小程序如何做seo

电子商务小程序进行SEO(搜索引擎优化)是一个综合性的过程,旨在提高小程序在搜索引擎中的排名,从而增加曝光度和用户流量。以下是一些关键的SEO策略和实践方法: 电子商务小程序如何做seo 1. 关键词研究与布局 关键词选…

第十七篇:TCP协议介绍(1)

1.TCP 的概念 传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在 TCP 协议中,通过三次握手建立连接。通信结束后,还需要断开连接。如果在发送数据包时&…

视频安防监控LntonAIServer安防管理平台抖动检测和过亮过暗检测

随着视频监控技术的发展,视频质量成为确保监控系统有效性的重要因素。LntonAIServer通过引入抖动检测与过亮过暗检测功能,进一步提升了视频监控系统的可靠性和用户体验。这些功能可以帮助及时发现并解决视频流中的质量问题,确保视频监控系统始…

数字广告监管者对高风险行业的打压,但是否应该...

不言而喻,如果你从事的是某些类型产品的推广业务,你需要格外小心。不懂我们的意思?那你算幸运了。我们指的是那些被归类为 高风险行业 的消费品或商业产品。 高风险行业是那些相较于其他行业“面临更多运营、监管和声誉风险”的行业。不完全列…

基于51单片机的倒计时装置proteus仿真

地址: https://pan.baidu.com/s/1p9xDKXaulyx-PyP6dURp-g 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…

[SwiftUI 开发] 构建带有动画的图片瀑布流效果

在移动应用程序中,图片瀑布流布局是一种常见的设计模式,它不仅能够以网格的形式显示大量图片,还能允许用户点击图片进行全屏查看。 在下文中,将详细介绍如何使用 SwiftUI 构建一个带有点击动画效果的图片瀑布流布局,并…

B站视频下载教程

文章目录 1.确保浏览器下载了tampermonkey(油猴)2.下载插件3.下载mtorix4.浏览器刷新并下载视频 1.确保浏览器下载了tampermonkey(油猴) 至于这个步骤可以自行搜索一下很简单,讲油猴固定在状态栏,显示如下 2.下载插件 1.进入greasyFork 2.搜索B站视…

【Unity-Lua】音乐播放器循环滚动播放音乐名

前言:Unity中UI节点 图1 如上所示,一开始本来是打算用ScrollView做的,觉得直接计算对应的文本位置就行,所以没用ScrollRect来做,可以忽略Scroll,Viewport这些名字。如下图:需要在一个背景Image…

多级别分销平台怎么做 千店系统设计关键要点

创建多级别分销平台可以帮助企业拓展市场并激励分销商,多级别分销商城的良好设计可以助力企业的营销事半功倍。今天,商淘云为您分享千店系统设计的三大关键要点。 首先,选择合适的平台和技术工具至关重要。使用像商淘云供应链这样的电商平台&…

睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩

日前,在先楫HPM6E00技术日上,睿赛德科技(RT-Thread)向广大工业用户展示了多年来双方在RISC-V生态领域的合作历程和成果,同时睿赛德科技携手先楫半导体首次推出了基于HPM6800处理器的EtherCAT主站解决方案,吸…

Uniapp + Vite + Vue3 + uView + Pinia 实现自定义底部 Tabbar(最新保姆级教程)

Uniapp Vite Vue3 uView Pinia 实现自定义底部 Tabbar(最新保姆级教程) 1、效果展示2、环境准备2.1 新建 uniapp 项目2.2. 安装 uView2.3 安装 pinia 3. 配置环境4. 创建目录结构5、编写 pages.json 页面路由6、编写 tabbar.js 状态数据7、编写 tabb…

Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。 摘抄: 简单字符串(Simple Strings): 以 “” 开头,例如 “OK\r\n” 表示一个成功的响应。错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一…

操作系统概述及特征

(较为浅显的了解操作系统,适合小白); 目录 1. 操作系统概述 1.1 操作系统 1.2 系统软件 1.3 主要作用 2. 操作系统的特征 ​编辑 2.1 并发性​编辑 2.2 并行​编辑 2.3 共享性 2.3.1 共享概述 2.3.2 共享与并发的关系…