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

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

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

相关文章

多模光纤收发器的基本参数及主要特点

多模光纤收发器具备地址过滤、网络分段及智能报警等功能,可提高网络工作效率及网络运行可靠性。飞畅科技10/100M双芯多模自适应以太网光纤收发器,采用最新美国KENDIN芯片,高品质光收发一体模块,性能稳定,质量优良。适用…

没有垃圾回收的JVM

JVM社区不断增加新的GC,最近又添加了一个新的GC,它称为Epsilon ,是非常特殊的一个。 Epsilon仅分配内存,但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途,我们将…

多模光纤收发器的应用领域及适用领域

双纤多模高性能10/100Mbit自适应光纤收发器(光电转换器),具备地址过滤、网络分段及智能报警等功能,可提高网络工作效率及网络运行可靠性。可实现最远5公里无中继计算机数据网的高速远程互连。产品性能稳定可靠,设计方面…

光电转换器有什么用 光电转换器的作用

现如今,网络已经是我们生活中所必不可缺的一部分了,我们一旦离开了网络就仿佛与世界脱轨,所以说网络现在在我们的生活中扮演者一个非常重要的角色。在这其中光电转换器是一种不可缺少的设备,它将我们要发送的电信号转换成光信号&a…

Java中的命令设计模式

在本教程中,我们将学习命令模式,这是一种重要的行为设计模式。 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能。 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间。 发送者对象可以创建命令对象。 …

光纤收发器怎么连接?

我们想要上网,就必须连接网络,而日常生活当中我们最常使用的网络就是宽带,连接宽带需要通过网线进行连接,但是网线在传输数据时它有一定的局限性,它的传输距离很小,一般情况下网线的传输距离仅仅只有100米&…

光纤收发器常见六大故障,三分钟全部搞定

光纤收发器,是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很多地方也被称之为光电转换器。光纤收发器一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,如:监控安…

光纤收发器出现死机故障怎么解决

众所周知,光纤收发器是一种将双绞线电信号和光纤的光信号进行互换的以太网传输设备,因此也被称为光电转换器。使用光纤收发器可以将网络的传输距离延伸到100公里以上。相信大家在光纤收发器使用过程中,有时候会遇到一些问题的,最近进碰到有用…

数据类被认为有害

这篇博客文章解释了从我参与的项目之一中删除Lombok项目的动机。 它反映了我的个人观点,并不妨碍特定的技术。 大约三年前,我认识了Project Lombok ,这是一个添加Java代码的库。 我从一开始就喜欢它,因为它贡献了很多有用的功能。…

光纤收发器测试方法大全

光纤收发器产品一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,且通常定位于宽带城域网的接入层应用;如:监控安全工程的高清视频图像传输。我们在使用光纤收发器的过程中,不可避免的会遇到一些问题&a…

Spring Boot:构建一个RESTful Web应用程序

介绍: REST代表表示状态传输 ,是API设计的体系结构指南。 我们假设您已经具有构建RESTful API的背景。 在本教程中,我们将设计一个简单的Spring Boot RESTful Web应用程序,公开一些REST端点。 项目设置: 让我们首先通…

光纤收发器具体是怎么分类的?

现如今,随着光纤收发器产品的多样化发展,其分类方法也各异,但各种分类方法之间又有着一定的关联,那么,光纤收发器具体是怎么分类的呢?接下来就由杭州飞畅地 小编来为大家详细介绍下吧! 按速率来…

光纤收发器的分类介绍

现如今,国外和国内生产光纤收发器的厂商很多,产品线也极为丰富,主要有深圳三旺通信、光路科技、瑞斯康达、烽火、飞畅、博威、德胜、Netlink、迅捷、腾达等。时下由于国内各大运营商正在大力建设小区网、校园网和企业网,因此光纤收…

java 编译 器 ide_在没有IDE的情况下编译和运行Java

java 编译 器 ide最近一个名为“ 不使用IDE编译Java软件包 ”的Java subreddit线程提出了一个问题:“是否有一个命令将软件包内的一组Java文件编译到一个单独的文件夹中(以下简称为bin),以及如何我会去运行新的类文件吗&#xff1…

光纤收发器的工作原理以及使用方法

关于光纤收发器的工作原理以及使用方法这块,在这里飞畅科技的小编做了专门的整理,首先,我们来了解下什么是光纤收发器,光纤收发器是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很…

Spring Boot登录选项快速指南

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 在本文中,您将研究使用Spring Boot 2.1实现登录功能的各种选项。 您将从最…

光纤收发器的故障处理

在之前,我们详细地介绍了光纤收发器的分类,我们了解到光纤收发器有单模、多模之分,单纤多纤之分,但是不管光纤收发器是怎么分类的,其故障的判断方法基本是一样的,总结起来光纤收发器所会出现的故障有&#…

光纤收发器怎么使用?

在网络建设及应用中,由于网线最大的传输距离一般为100米,因此布建远距离传输网络的时候不得不使用光纤收发器等中继设备。光纤收发器一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中。那么,光纤收发器该如何使用呢…

光纤收发器通常具有哪些特点?

光纤收发器,是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很多地方也被称之为光电转换器,其产品一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,且通常定位于宽…

光纤收发器的实际应用范围介绍

众所周知,光纤收发器的有很多不同的分类,种类很多,在实际使用中大多注意的是按光纤接头不同而区分的类别:SC接头光纤收发器和FC/ST接头光纤收发器。接下来小编就来为大家介绍下光纤收发器的具体应用范围有哪些,想要了解…