通过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,一经查实,立即删除!

相关文章

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

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

【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;点击底部的“应用”和…

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

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

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

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

Onetab快速删除所有历史网页

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

golang的jwt学习笔记

文章目录 初始化项目加密一步一步编写程序另一个参数--加密方式关于StandardClaims 解密解析出来的怎么用关于`MapClaims`上面使用结构体的全代码实战项目关于验证这个项目的前端初始化项目 自然第一步是暗转jwt-go的依赖啦 #go get github.com/golang-jwt/jwt/v5 go get githu…

好用的截图工具

目录 截图软件介绍 神器2——Snipaste PicPick——自带画图 LightShot——自带图床 功能总结 截图软件介绍 参考推荐5个截图工具&#xff08;超好用&#xff09; - 知乎&#xff0c;列出几个好用的截图工具 神器2——Snipaste 超级好用&#xff0c;QQ的功能Snipaste全都有…

如何在Flutter(REST API)中进行API调用

在本文中&#xff0c;我们将探讨如何在波动中进行API调用并使用简单的REST API。 在这里查看我在Flutter上的其他一些帖子&#xff1a; Flutter vs React Native 了解Flutter中的BLoC架构 &#xff08;强烈建议&#xff09; 在Flutter中构建ListView&#xff08;RecyclerVi…

sublime关闭左边文件路径快捷键

目录 背景 解决方法 方案一&#xff1a; 方案二&#xff1a; 背景 sublime查看某一文件具体内容&#xff0c;左边文件路径占用一部分空间&#xff0c;影响观看 解决方法 方案一&#xff1a; 使用快捷键&#xff1a;关闭和打开相同&#xff0c;先按 CtrlK&#xff0c;再按…

Typora全局搜素

目录 背景 解决方式 全局文件夹下搜索 方法一 方法二 单一文件下搜索 查找功能 1 查找整个单词 ​2 区分大小写 背景 有时需要在打开的文件夹中所有文件搜索某一单词&#xff0c;有时需要在一个文件下搜索 解决方式 全局文件夹下搜索 方法一 方法二 快捷键&#x…

linux 内存不足杀进程_内存不足:杀死进程或牺牲孩子

linux 内存不足杀进程现在是早上六点。 我清醒地总结了导致我太早唤醒电话的事件顺序。 这些故事开始时&#xff0c;我的电话警报响了。 困倦而脾气暴躁的我检查了电话&#xff0c;看我是否真的疯了以至于无法在凌晨5点设置唤醒警报。 不&#xff0c;这是我们的监视系统&#x…

为什么声明性编码使您成为更好的程序员

在许多情况下&#xff0c;具有功能组成的声明式解决方案提供了优于传统命令式代码的优越代码度量。 阅读本文并了解如何使用具有功能组成的声明性代码成为更好的程序员。 在本文中&#xff0c;我们将仔细研究三个问题示例&#xff0c;并研究用于解决这些问题的两种不同技术&am…

高效的企业测试-单元和用例测试(2/6)

在本系列的第一部分中&#xff0c;我们看到了有效测试应满足的一些普遍适用的原则和约束。 在这一部分中&#xff0c;我们将仔细研究代码级单元测试以及组件或用例测试。 单元测试 单元测试验证单个单元&#xff08;通常是类&#xff09;的行为&#xff0c;而忽略或模拟该单元…

搜狗输入法更换字体与皮肤

图标上右键-更多-属性设置 效果&#xff1a; 注意&#xff1a;如果是新安装的字体&#xff0c;更换中文字体但其中列表没有显示&#xff0c;可以取消更换字体前面的对钩后&#xff0c;重新选择对钩&#xff0c;此时就显示新的中文字体了

javafx 8u40_JavaFX 8u20天的未来过去(始终在最前面)

javafx 8u40自从我发布有关JavaFX的主题以来已经有很长时间了。 因此&#xff0c;如果您仍在追随&#xff0c;那就太棒了&#xff01; 介绍 在这篇博客文章中&#xff0c;我想写一篇关于从JavaFX 8 update 20开始的非常酷的功能的博客&#xff0c;该功能使您的应用程序始终位于…

如何在内存序列化中使用Java深克隆对象

在我以前的文章中&#xff0c;我解释了深度克隆和浅层克隆之间的区别 &#xff0c; 以及复制构造函数和防御性复制方法比默认的Java克隆更好。 使用复制构造函数和防御性复制方法进行的Java对象克隆当然具有某些优势&#xff0c;但是我们必须显式编写一些代码才能在所有这些方…

复制网页内容

问题背景&#xff1a; 当网页复制东西时&#xff0c;可能因为某些原因导致无法复制。可以用以下方法解决 解决方法&#xff1a; 1. 按下F12&#xff0c;出现以下内容 2. 依次点击右上角三个点&#xff0c;弹出界面后点击shortcuts 3. 选择首选项后&#xff0c;选中Disable …