zing jvm_Zing加快了JVM应用程序的预热

zing jvm

Java虚拟机(JVM)提供了托管运行时环境,用于安全部署应用程序,其性能通常可以超过本机编译语言(如C和C ++)。 通过即时(JIT)编译进行垃圾回收和自适应编译的内存管理是两个最突出的功能。

尽管使用字节码和JIT编译可以提供更好的峰值性能,但是对于某些类型的应用程序,达到该级别所需的预热时间可能会成问题。

在本文中,我们将研究Azul作为Zing JVM的一部分开发的一组技术,以解决这些限制。

首先,让我们看一下在JVM上运行时应用程序性能的典型图表。

JVM应用程序

该图并不理想,因为应用程序开始时性能降低,并且JVM需要时间才能发挥其全部潜能。 该图可以分为三个不同的部分: 让我们看一下JVM内部发生的每种情况。

  • 当应用程序启动时,JVM必须加载并初始化必要的类。 完成此操作后,JVM将在main()入口点开始执行。 由于JVM是虚拟机 ,因此它不会使用与运行它的物理机相同的指令集。 因此,有必要将类文件的字节码转换为物理CPU的指令集。 这称为字节码解释 。 必须对每个执行的字节码重复此操作,这会导致性能比本地编译的应用程序低得多。 这在很大程度上是因为Java首次发布时缓慢的声誉。

    上图以黄色显示了已解释的模式。
  • 为了减轻在解释模式下运行的问题,JVM在内部记录了每种方法调用频率的统计信息。 这样,它就可以为重复调用的方法(例如,长时间运行的循环)中的代码识别热点 (因此称为Oracle JVM)。 当方法调用计数达到定义的阈值时,JVM将方法传递给内部编译器,该编译器称为即时编译器(通常称为JIT)。

    JVM在此阶段使用的编译器称为C1(以前,也称为客户端编译器)。 C1 JIT旨在尽快生成代码,以便快速提高这些方法的性能。 为此,C1将仅应用最简单的优化,这些优化不需要其他配置数据或需要很长时间才能生成。 如上图的绿色部分所示,随着编译更多方法,性能逐渐提高。 在此代码运行时,JVM将收集有关如何使用该方法以及如何执行代码的全面分析数据。
  • 在调用方法的次数达到第二个阈值时,JVM将使用其他JIT编译器重新编译该方法。 在Zing的情况下,这是基于开源LLVM项目的Falcon JIT。 默认的OpenJDK二级JIT编译器为C2,它非常旧且难以增强。

    Falcon是比C1更复杂的编译器。 它使用在执行C1生成的代码期间收集的概要分析数据以及JVM中的其他内部数据,将最大程度的优化应用于其生成的代码。 这是图表的蓝色部分,一旦所有常用方法都已编译,性能最终将达到最高水平。 此时,该应用程序被视为已预热

现在,我们了解了JIT编译在JVM中的工作方式,可以采取哪些措施来减少其对应用程序启动性能的影响? Azul开发了两种技术,使Zing JVM能够减轻预热效果。

关于如何解决此问题的一个常见建议是让应用程序运行,直到所有常用的方法都已JIT编译,然后让JVM将已编译的代码写入文件中。 重新启动应用程序后,可以重新加载以前编译的代码,并且应用程序将以停止之前的速度运行。

听起来不错的解决方案,但有两个重大缺点:

  • 尽管代码是为正在运行的应用程序编译的,但是不能保证在重新启动JVM时它仍然有效。 为何使用断言是一个很好的例子。 如果在禁用断言的情况下运行应用程序,则JIT将消除代码的相关部分。 如果随后在启用断言的情况下重新启动应用程序并使用先前编译的代码,则断言将丢失。
  • 有一个关于JVM必须如何工作的精确定义,这就是JVM规范。 它包含在Java SE规范中,该规范是根据JCP在相关JSR中创建的。 这定义了当JVM运行应用程序时必须执行的特定任务。 必须先显式加载和初始化类,然后才能使用它们。 同样,如果使用了先前编译的代码,这可能会使JVM的正确操作无效。

Azul的ReadyNow! 技术采用了另一种方法,可以确保正在执行的代码和JVM的启动顺序都完全正确。

要实现此ReadyNow! 记录正在运行的应用程序的配置文件。 可以随时获取配置文件,以便用户可以决定他们的应用程序何时以所需的级别运行。 可以拍摄多个配置文件快照,以便用户可以在重新启动应用程序时选择所需的配置文件。

该配置文件记录五段数据:

  1. 已加载的所有类的列表。
  2. 已初始化的所有类的列表。
  3. 在执行C1 JIT编译代码期间收集的概要分析数据。
  4. C1和Falcon JIT均执行编译。
  5. 失败并导致代码未优化的推测优化列表。

再次启动应用程序时,此数据将用作JVM的高级知识,以执行以下步骤:

  • 加载配置文件中列出的所有引导程序和系统类。
  • 初始化那些已加载类的安全子集。 被认为是安全的类是JMV规范允许的类。
  • 确定所需的类加载器后,将立即加载配置文件中的其他类。 如前所述,由于Java平台的动态特性,这是必需的。
  • 概要分析和推测性优化数据用于使用Falcon JIT编译所需的方法。

所有这些都在应用程序在main()入口点开始执行之前发生。

这样的效果是,当应用程序开始执行时,几乎所有热门方法都已使用Falcon JIT进行了编译。 通过使用概要分析数据,可以对代码进行大量优化,并使用已知有效的推测性优化(也可以避免不必要的优化)。 性能始于非常接近收集概要文件时的水平。 由于此过程的工作方式受到一些限制,因此应用程序通常仅需要执行少量事务即可使其全速运行。

但是,此方法确实会产生影响。 在应用程序何时可以开始处理事务之前,JVM还有很多工作要做。

为了减轻这种影响,Azul开发了Compile Stashing

正如我们已经看到的,在重新启动应用程序时,不可能简单地保存已编译的代码然后重新加载它。 但是,可以保存已编译的代码并将其实际上用作高速缓存。

方法的字节码与保存的性能分析数据组合在一起,因此可以将它们转换为编译器使用的中间表示(IR)。 在编译代码时,JIT将调用JVM,以帮助其做出有关可以使用的优化的决策。 例如,要确定是否可以内联方法,JIT必须首先确定该方法是否可以进行虚拟化,这需要查询JVM。 JIT完成对方法的分析后,便可以最大程度的优化对其进行编译。

这个过程是完全确定的。 给定相同的方法字节码和配置文件数据作为输入以及对JVM的相同查询集,JIT编译器的输出将始终相同。

编译存储补充ReadyNow! 除了记录配置文件外,还将当前编译方法的本机代码以及VM回调的查询和响应写入文件。 当应用程序再次启动时,ReadyNow! 像以前一样,根据配置文件加载并初始化可以的类。 但是,保存的已编译方法现在用作缓存,以减少对显式编译的需求。 操作流程图如下所示:

JVM应用程序

好了! 将IR用于方法的字节码,并查询编译期间使用的VM的组合,以确定存储的编译代码是否匹配。 如果是这样,则可以从“编译存储区”返回该代码。 如果由于某种原因输入与编译请求不匹配,则可以像以前一样将其传递给Falcon JIT。 重要的是要注意,使用此技术不会使JVM规范中有关应用程序初始化的任何要求无效。

测试表明,使用“编译存储”,ReadyNow!需要的编译时间! 最多可减少80%,并减少60%的CPU负载。

如您所见,ReadyNow! 和Compile Stashing通过记录类加载和性能分析数据,无效的推测性优化以及已编译的代码来解决应用程序预热时间的问题。 重新启动应用程序时使用所有这些组件可以大大减少应用程序达到最佳性能水平所需的时间和CPU负载。

Zing是启动速度快,保持速度快且运行速度更快的JVM。

准备开始使用更好的JVM了吗?

在您选择的Linux发行版上尝试Zing Free ...

翻译自: https://www.javacodegeeks.com/2019/06/faster-jvm-application-warm-zing.html

zing jvm

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

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

相关文章

黎明觉醒测试服服务器维护怎么办,黎明觉醒测试资格进不去怎么办

黎明觉醒测试资格进不去怎么办?黎明觉醒游戏在在9月16日迎来曙光测试,相信不少玩家都去玩了发现自己进不去游戏,这是怎么回事呢?和小编一起来看看吧。黎明觉醒测试资格进不去怎么办一、测试资格进不去获得测试资格的玩家官方已提前…

查看Linux命令_搜索Linux命令_查找Linux命令

站点1:https://tool.lu/command/ 站点2:https://www.linuxcool.com/

蜂鸣器音乐代码 天空之城_潮玩 | 艺术展览,乐队live现场,网红小黑泥,贩卖“美好”的市集……一场未来公共生活,天空之城和你一起探索!...

第一次打卡这样的新媒体艺术作品,不是画作,也不是艺术品陈列,而是一场看的见的引力交响曲~错落的磁场具象成看得见的流动痕迹,不动声响却震撼的感官体验。很容易让人沉浸其中,去捕捉流动的方向和瞬间。虽然UFO是没看到…

自动部署 管道 ci cd_自动化测试在CI CD管道中的作用

自动部署 管道 ci cd业界广泛采用的软件开发实践:持续集成和持续部署可确保良好地交付产品并经常交付。 常规代码提交需要常规/连续测试,而如果忽略它,则可能导致非弹性基础结构。 如何交付坚固的CI CD管道? 对于许多公司来说&…

Maven的maven-install-plugin插件详解

文章目录将下载到本地的jar文件安装到Maven本地仓库中将当前项目安装到Maven本地仓库中参考maven-install-plugin 插件的作用:1.可以将当前项目安装到 Maven 本地仓库,供本地其它 Maven 项目使用 执行 mvn install 命令将当前项目安装到 Maven 本地仓库…

python字典_Python 字典

1、什么是 dict(字典)上一章节,我们学习了列表(List) 和 元组(tuple) 来表示有序集合。而我们在讲列表(list)的时候,我们用了列表(list) 来存储用户的姓名。name [一点水, 两点水, 三点水, 四点水, 五点水]那么如果我们为了方便联系这些童鞋&#xff0c…

hazelcast_Java:如何在不到5分钟的时间内通过Hazelcast提高生产力

hazelcast如果要使用Hazelcast内存数据网格(IMDG)来加快数据库应用程序的速度,但是要处理数百个表怎么办? 手动编码所有Java POJO和序列化支持将需要数周的工作,完成后,手动维护该域模型将很快成为一场噩梦…

Maven的maven-help-plugin插件详解

执行下面的命令查看指定插件的详细信息: [~/Documents/IdeaProjects/demo02]$ mvn help:describe -Dpluginorg.apache.maven.plugins:maven-site-plugin:3.9.0 -Ddetail上述命令执行的是 maven-help-plugin 的 describe 目标,在参数 plugin 中输入需要描…

android官方文档中文版_最全实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...

点击 机器学习算法与Python学习 ,选择加星标精彩内容不迷路本文转自机器之心在 Github 上一度蝉联最流行的机器学习和数据科学包 NumPy,已经有了非常之系统的中文文档,回想起当初细啃 NumPy 之时,不少人不得不徘徊于各大搜索引擎及…

tls jdk_使用JDK 13查看TLS配置

tls jdkJDK 13 Early Access Build 16现在可用,它带来的有趣的功能之一是能够使keytool命令行工具显示当前系统的TLS配置信息 。 这比尝试在单独的文档中查找受支持的TLS信息并将该信息与自己的JDK供应商和版本进行匹配要容易得多。 要查看JDK 13 Early Access Bui…

执行Plugins下的install:install报错:The packaging for this project did not assign a file to the build artif

文章目录导致错误的原因分析解决方法直接执行生命周期的某个阶段命令阶段和插件目标一起执行参考导致错误的原因分析 在 IDEA 中使用 Plugins 下的 install:install (或者在命令行下执行命令 mvn install:install),代表执行的是 install 插件…

javascript等待异步线程完成_前端:什么是单线程,同步,异步?彻底弄懂 JavaScript 执行机制...

javascript是按照语句出现的顺序执行的。js是一行一行执行的:let a 1;console.log(a);let b 2;console.log(b);然而实际上js是这样的:setTimeout(function(){ console.log(定时器开始啦)});new Promise(function(resolve){ console.log(马上执行for循环…

react回调_回调地狱和React模式

react回调我可以更好地了解a的用途的一种方式 基于React流的方法是它简化了无阻塞IO调用的方式。 这篇文章将快速讲解进行同步远程调用所涉及的那种代码,然后说明如何在非阻塞IO中分层,尽管在资源(尤其是线程)的使用方面非常高效…

Maven插件列表_Maven插件查询_Maven插件查看

Maven 官方插件列表:https://maven.apache.org/plugins/index.html。 Maven 官方插件下载地址:https://repo1.maven.org/maven2/org/apache/maven/plugins/

jsp循环输出表格_「翻译」JS可视化学习之七:Promise、事件循环和异步2

喜欢排队吧,它能保护你的时间和精力 - 排队纪律维护员Event LoopPromise和事件循环概览图请注意上面这张图,Promise和事件循环的那些事,将在这个图上缓缓展开。微任务和(宏)任务好了,(经过上一节对Promise的理解)现在我们对如何创…

azure api 管理_具有Azure功能的无服务器API

azure api 管理在这篇文章中,我将研究一个非常简单的用例。 在执行部署管道时, FlexDeploy可能会产生一些应被批准或拒绝的人工任务。 例如,某人必须批准对生产环境的部署。 可以在FlexDeploy UI中或通过某些外部通信渠道来完成。 今天&#…

Maven插件目标

插件就是打成 jar 包的 Java 类,目标其实就是指方法,代表一种功能,也就是代表执行一种任务,你可以指定具体的任务,不过目标也有自己默认的任务。

android 渐变圆形进度条_flutter好用的轮子推荐七-flutter圆形或线型进度条

前言Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。IT界著名的尼古拉斯高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!Flutter作为这两年开始崛起的跨平台开发…

jakarta ee_Jakarta EE中的规范范围

jakarta ee使用Eclipse Foundation Specification Process (EFSP),一个开放源代码规范项目就有一个专门的提交者项目团队来创建和维护一个或多个规范。 创建和维护的周期跨越了该规范的多个版本,因此尽管各个成员可能来去去去&…