通过Main的Checkpoint Restore加快Java启动速度

Java虚拟机为已编译为字节码 (但不一定是用Java编写)的应用程序提供了托管运行时环境。 与为特定平台静态编译的代码相比,这为应用程序开发人员提供了许多好处,并且通常可以提高性能。 JVM通过垃圾回收器 (GC)自动处理内存分配和恢复,从而减少了内存泄漏的可能性。 即时(JIT)编译提供了“一次编写,可在任何地方运行”的功能,无需为支持的每个平台构建单独的应用程序二进制版本。

但是,这些优势并非完全没有成本。 尽管在JVM上运行的应用程序的整体速度最终可能会更快,但是由于编译和优化了常用方法,因此需要一定的预热时间。 每次启动应用程序时,都必须执行相同的性能分析,分析和编译,即使该应用程序使用相同。

多年来,Azul Systems一直在研究使JVM这些方面的性能影响最小化的方法。 Zing JVM使用Falcon JIT编译器代替了旧的C2 JIT和ReadyNow! 记录可在重新启动应用程序时使用的配置文件的技术。

Azul的OpenJDK的Zulu构建现在包括一组类似的技术,我们称之为Main(CRaM)的Checkpoint / Restore。

CRaM的想法是通过执行训练运行来减少应用程序的预热时间,然后可以在生产运行期间使用它。 可以通过三种不同的方式执行训练运行:

  1. 正常使用该应用程序,并执行所需的任何功能。 该应用程序通过退出main()方法终止。 此时,将记录来自应用程序运行的所有数据。 无需更改应用程序代码; 仅需添加-Zcheckpoint JVM标志。
  2. 根据上面的方案1,使用该应用程序,但通过调用System.exit()终止该应用程序。 同样,无需更改应用程序代码,但是在这种情况下,必须使用JVM标志-Dcom.azul.System.exit.doCheckpointRestore = true。
  3. 在这种情况下,开发人员在应用程序代码中选择一个特定点,他们希望在此生成检查点。 必须更改应用程序代码; 在需要的地方放置了对方法Dcom.azul.System.tryCheckpointRestore()的调用。 这对于不终止的应用程序很有用。 除非为JVM指定了-Zcheckpoint标志,否则该调用将被忽略。 附加标志-XX:CRTrainingCount可用于使应用程序在记录检查点之前处理多个事务。

检查点是创建应用程序状态时的复杂快照。 它包含以下信息:

  • JVM的Java类的内部表示。 每次应用程序启动时,它都需要读取所需的类,并使用初始化的数据为每个类创建自己的表示形式。
  • JVM JIT编译器C1和C2生成的代码。 由于该代码的重用方式,有必要关闭某些优化以使该代码在生产运行中得以重用。
  • 初始化的系统类。 这些是核心类库中的类,并且独立于任何应用程序代码。
  • 堆中与应用程序启动相关的某些Java对象。

对于可以在生产运行中使用检查点的地方,存在严格的限制。 检查点与用于训练运行的平台紧密相关,并且包括非常低级的信息,例如来自映射系统库(如libc)的内存页。 如果在执行生产运行之前对系统库,JDK或应用程序代码进行了更改,则检查点将不起作用。 检查点只能在运行相同硬件和软件堆栈的计算机之间共享。

要将检查点用于生产运行,应使用如下命令行:

java -Zrestore myAppClass <application arguments>

先前存储的检查点数据将用于最大程度地减少与应用程序关联的预热时间。 有两点需要注意:

  • 在生产运行期间,可以将代码重新编译为JIT编译过程的正常部分。 与培训期间不同,将启用JIT可用的所有优化。
  • 需要从生成训练运行的目录中启动该应用程序。 这是检查点状态的一部分。
  • 不应使用JVM命令行标志。 训练运行与创建期间使用的命令行标志相关联,然后在生产运行期间自动设置这些标志。 更改它们可能会使检查点中的信息无效。

当前,CRaM功能面向嵌入式应用程序,在这些应用程序中,启动时以最佳速度运行的能力至关重要。 因此,CRaM支持的平台仅是Arm 32位处理器,运行Linux的内核为3.5或更高版本以及glibc 2.13或更高版本。 CRaM包含一个实用程序cr-compat-checker,可用于验证设备是否满足这些要求。

为了确定CRaM是否适合某个应用程序,了解它如何更改应用程序的性能概况至关重要。 CRaM旨在减少到达生成检查点的时间。 从那时起,无论是否使用检查点,执行都将保持不变。 查看Java应用程序的性能时,它可以分为两部分:JVM启动时间,即到达main()入口点的时间; 和时间从main()运行。 使用CRaM时,到达main()所需的时间会更长,但是到达创建检查点的位置所需的时间会更少。

为了使这一点更易于理解,图表非常有用:

例如,考虑一个简单的Spring Boot应用程序。

在不使用CRaM的情况下,到main()的时间为2秒,从进入main()到完全初始化的应用程序(准备处理交易)的时间为31秒。 因此,处理交易之前需要的时间为33秒。

完成检查点后,使用CRaM启动应用程序,到main()的时间增加到3秒。 但是,从输入main()到完全初始化的时间仅为18秒。 这样可以将处理事务之前所需的时间减少到仅21秒,这实际上要快得多。

如您所见,CRaM可以在需要准备好尽快执行任务的应用程序的有效性方面产生重大影响。 这在嵌入式应用程序中尤其重要,在嵌入式应用程序中,资源受到限制,并且与传统服务器相比,设备可能需要更频繁地重新启动。

Azul目前正在进行CRaM的Beta版测试。 如果您有兴趣参与其中,请与我们联系以获取更多信息。

联系AZUL了解更多信息

翻译自: https://www.javacodegeeks.com/2019/08/faster-java-startup-checkpoint-restore-main.html

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

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

相关文章

notion常用快捷键

由于我自己的电脑是window10系统&#xff0c;我也就只整理window系统的快捷键。notion官网上有全部快捷键的教程&#xff0c;链接如下&#xff1a; https://www.notion.so/Learn-the-shortcuts-66e28cec810548c3a4061513126766b0 这篇博客来自于我的CSDN账号&#xff0c;里面…

“操作无法完成因为其中的文件夹或文件已在另一个程序中打开”解决办法

在windows系统中&#xff0c;我们经常会遇到这样一个问题&#xff1a;删除某一个文件或者文件夹&#xff0c;被提醒&#xff1a;操作无法完成&#xff0c;因为其中的文件夹或文件已在另一个程序中打开。 这个时候我们一般会先检查是否真的有程序或者文件打开了没有关闭&#xf…

带有AngularJS资源的Spring Rest Controller

Angularjs ngResource是用于与基于REST的服务进行交互的angularjs模块。 我最近在Spring MVC的一个小型项目中使用了它&#xff0c;并希望记录一个对我来说很好的配置。 该控制器在工厂中运行&#xff0c;它支持在Hotel实体上进行CRUD操作&#xff0c;并支持以下方法&#xff…

【CLion】如何编译运行单个文件 (C/C++ Single File Execution插件的使用)

如果你知道如何使用 C/C Single File Execution 插件但仍然无法找到运行按钮 请直接看第五张图片 一、 这里我首先新建了一个项目&#xff0c;名为Demo 又在项目文件夹内新建了一个代码文件&#xff0c;名为TestCode 二、 然后在 File - Settings - Plugins 中搜索 C/C Single…

使用Mocks进行需求驱动的软件开发

jmock作者撰写的有关模拟框架的优秀论文 。 本文写于18年前的2004年&#xff0c;但其中有许多构建可维护软件系统的技巧。 在这篇文章中&#xff0c;我将重点介绍本文中的关键思想&#xff0c;但建议您阅读本文&#xff0c;以获取有关模拟和编程实践的重要思想。 模拟对象是测…

W10关闭警告声音

点击电脑左下角的“开始”按钮 在开始菜单中点击打开“设置” 在设置窗口中点击“个性化” 在轻松使用界面左侧点击“主题” 接着在右侧找到并点击“声音” 在弹出的窗口中点击“声音方案”下面的方框 在弹出的列表中选择“无声”&#xff0c;点击底部的“应用”和…

Ubuntu常用快捷键

命令行中快捷键 Tab 自动补全 Ctrla 光标移动到开始位置 Ctrle 光标移动到最末尾 Ctrlk 删除此处至末尾的所有内容 Ctrlu 删除此处至开始的所有内容 参考 Ubuntu 快捷键命令_糖糖糖-豆的博客-CSDN博客_ubuntu命令行快捷键

camel 调用soap_使用Apache Camel通过soap添加WS-Security

camel 调用soapWS-Security&#xff08;Web服务安全性&#xff09;是一个协议&#xff0c;可让您保护自己的soap Web服务。 发出Soap请求的客户端必须在Soap标头中提供登录名和密码。 服务器接收到肥皂请求&#xff0c;检查凭据并验证请求是否正确。 使用Apache Camel&#xf…

Typora中插入分页符

由于typora基于html&#xff0c;插入分页符的方法&#xff08;在导出成PDF时生效&#xff09;&#xff1a; <div style"page-break-after:always"></div>

使用Spring Boot Actuator监视Java应用程序

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 您是否曾与Spring Boot Actuator合作&#xff1f; 这是一个非常有用的库&#xff0c;可帮助您…

【sublime】 按 ctrl+shift+f没有反应(系统:win10+搜狗输入法)

系统&#xff1a; win10 输入法&#xff1a; 搜狗 问题&#xff1a; sublime 按 ctrlshiftf没有反应 原因&#xff1a; sumlime 中 ctrlshiftf 与搜狗繁简切换冲突 解决&#xff1a; A. 右击搜狗输入法状态栏&#xff08;就是那个小条条&#xff09;&#xff0c;选择属性设…

SublimeText3 ctrl+f打开搜索框后怎么关闭

按esc就可以退出了&#xff0c;点那个 find all也会退出

javaone_JavaOne 2014 –有关提交的一些初步分析

javaone这些天时间不多了。 并行发生的事情如此之多&#xff0c;当然&#xff0c;最重要的Java会议就是一切。 JavaOne 2014已经关闭了CfP门&#xff0c;投票正在进行中。 程序委员会几乎没有什么可以谈论的&#xff0c;但是去年跳过了这种分析之后&#xff0c;现在是我寻求许…

Sublime打开与关闭右侧缩略图

启动sublime text 3软件&#xff0c;如图所示&#xff1b; 发现右侧缩略图占据了太大的位置&#xff0c;瞬间感觉整个世界都不好了&#xff1b; 要想关闭这个缩略图&#xff0c;需要到菜单视图里面设置&#xff0c;首先点击菜单栏“view”——“hideMiniMap”&#xff1b;如图所…

Sublime Text 如何查看当前文件的编码格式?

打开preference->setting->输入下面代码 "show_encoding": true,"show_line_endings": true 此时保存该配置文件&#xff0c;就能够看到 sublime 最底下一行会显示文件编码格式了。以上的配置内容在 Perference → Setting─Default 都是 false 的。…

jaxb-xjc.jar_使用xjc在一秒钟内生成您的JAXB类

jaxb-xjc.jar由于JAXB是JDK的一部分&#xff0c;因此它是处理XML文档最常用的框架之一。 它提供了一种从XML文档检索数据并将其存储到Java类的简便方法。 因为几乎每个Java开发人员都已经使用过JAXB&#xff0c;所以我不会解释不同的JAXB批注。 相反&#xff0c;我将重点介绍一…

修改Typora默认的字体为好看秀美的中文字体“华康手札体“

一 下载并安装"华康手札体W5P"字体 &#xff08;1&#xff09;下载方式&#xff1a; 1. 方式一 http://www.downcc.com/font/341067.html2.百度云链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/125Hh-tqWOy1Ht-GvD_P2MQ 提取码&#xff1a;z6ka 复制…

测试Spring Boot有条件的合理方式

如果您或多或少有经验的Spring Boot用户&#xff0c;那么很幸运&#xff0c;在某些时候您可能需要遇到必须有条件地注入特定bean或配置的情况 。 它的机制是很好理解的 &#xff0c;但有时这样的测试条件下&#xff08;以及它们的组合&#xff09;可能会导致混乱。 在这篇文章中…

金山打字通答案

背景 金山打字通练习键盘键位&#xff0c;需要对第一关熟悉键盘知识进行答题。一下整理答案 答案 ABADCBCA

Onetab快速删除所有历史网页

1. 打开网页的控制台&#xff08;F12&#xff09; 2. 控制台粘贴该命令 document.querySelectorAll(div.deleteAllButton).forEach(function(ele, index, list){ele.click();});3. 然后按住回车&#xff08;有 conform 弹框需要确认&#xff09;&#xff0c;等待全部清空