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

checkpoint

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

checkpoint

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

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

相关文章

泛型数组列表ArrayList

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理清 java 中的 数组列表 ArrayList&#xff1b; 【2】数组列表 ArrayList 2.1&#xff09;ArrayList&#xff1a; ArrayList 具有自动调节数组容量的功能&#xff0c; 而不需要为此…

大数据聚类分析用于预测_多模态数据中的非负矩阵分解用于分割和标签预测

引用Akata Z, Thurau C, Bauckhage C. Non-negative matrix factorization in multimodality data for segmentation and label prediction[C]. 2011.摘要随着 Internet 上带注释的多媒体数据的可用性不断提高&#xff0c;要求有一种技术可以实现不同类型数据的原则性联合处理。…

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

程序员 rs编码在许多情况下&#xff0c;具有功能组成的声明式解决方案提供了优于传统命令式代码的出色代码指标。 阅读本文并了解如何使用具有功能组成的声明性代码成为一名更好的程序员。 在本文中&#xff0c;我们将仔细研究三个问题示例&#xff0c;并研究用于解决这些问题…

对象包装器与自动(拆箱)装箱+参数数量可变的方法+枚举类

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 自动拆箱&#xff08;装箱&#xff09;、printf的参数数量可变 以及 枚举类的详细说明&#xff1b; 0.2&#xff09; 源代码&#xff1a; https://github.com/pacosonTang/core…

go 监测tcp 连接断开_TCP三次握手和四次挥手以及11种状态

三次握手置位概念&#xff1a;根据TCP的包头字段&#xff0c;存在3个重要的标识ACK、SYN、FINACK&#xff1a;表示验证字段 SYN&#xff1a;位数置1&#xff0c;表示建立TCP连接 FIN&#xff1a;位数置1&#xff0c;表示断开TCP连接三次握手过程说明&#xff1a;1.由客户端发送…

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

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

java反射机制+继承设计技巧

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java反射机制 &#xff1b;最后还顺带提出了 继承设计的技巧&#xff1b; 【1】反射相关 1&#xff09;反射定义&#xff1a;能够分析类能力的程序称为反射&#xff1b; 2&…

60秒计时器的仿真电路_基于伏秒平衡的同步整流方案探讨

为了提高电源的效率和功率密度&#xff0c;尤其是低输出电压的应用场合&#xff0c;同步整流是不可或缺的。图1-1 反激输出二极管损耗比如上图的反激电源如果输出二极管 Vf0.7V&#xff0c;输出电压 Vout3V 则效率不会高于3/(30.7)81%。为了提升效率一般会选用低导通压降的肖特…

利用反射机制创建新类的两种方式及比较

【0】README 0.1&#xff09; 本文描述源代码均 转自 http://blog.csdn.net/fenglibing/article/details/4531033 &#xff0c; 旨在深入理解 如何利用反射机制创建类实例&#xff1b; 0.2&#xff09; 转载的源代码&#xff0c;参见 https://github.com/pacosonTang/core-ja…

如何设计高效测试用例_高效的企业测试-单元和用例测试(2/6)

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

php mysql study_PHPstudy升级mysql数据库

首先查看phpstudy的mysql版本&#xff1a;方法一 使用mysql的version函数&#xff1a;mysql> selectversion();方法二 status命令mysql> status&#xff1b;方法三 直接在cmd下输入命令查看mysql -vmysql --help下面开始升级数据库1、备份好自己的数据库2、清空phpstudy…

selenium 等待_Selenium等待:内隐,外显,流利和睡眠

selenium 等待Selenium等待页面加载在Selenium脚本中起着重要的作用。 它们有助于使它们不易剥落&#xff0c;更可靠。 Selenium提供多次等待&#xff0c;以根据某些条件在脚本执行中提供足够的等待或暂停。 从而确保您在使用Selenium执行自动化测试时不会导致脚本失败。 在本教…

java接口概述

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java 接口概念 &#xff1b; 0.2&#xff09;接口技术&#xff1a; 这种技术主要用来描述类具有什么功能&#xff0c; 并不给出每个功能的具体实现&#xff1b; 一个类可以实现多…

通过aws部署推荐系统_通过AWS Elastic Beanstalk轻松进行Spring Boot部署

通过aws部署推荐系统朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证&#xff0c;管理和保护。 几乎所有应用程序都依赖于身份验证。 开发人员以及雇用他们的公司都想确认…

图论算法基础

【0】README 0.1&#xff09;本文总结于 数据结构与算法分析&#xff0c; 旨在复习数据结构中图论算法的基础知识&#xff1b; 【1】图论若干相关定义 1.1&#xff09;图G定义&#xff1a;一个图G&#xff08;V&#xff0c;E&#xff09;由顶点及集V 和 边集E组成&#xff0c…

mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决

问题&#xff1a;直接拷贝data下的数据库数据进行备份&#xff0c;重装升级了数据库&#xff0c;直接复制备份数据到新的数据库data目录下&#xff0c;发现部分数据表不见了。原因分析&#xff1a;以表“Table”为例:如类型是MyISAM, 数据文件则以”Table.frm”&#xff0c;”T…

aws 删除ec2实例_如何在AWS EC2实例上部署Spring Boot应用程序

aws 删除ec2实例你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何在AWS EC2实例上部署Spring Boot应用程序。 这是我们将要执行的步骤。 1.使用Spring Boot Initialiser创建一个Spring Boot项目。 2.创建一个休息端点&#xff0c;部署后我们可以访问 3.启动EC2…

jdbc操作mysql数据库_JDBC操作MySQL数据库(一)

连接MySQL数据库连接数据源有两种方式&#xff1a;1)通过DriverManager类2)通过DataSource接口及JNDI资源获得连接DriverManager类的路径为java.sql.DriverManager&#xff0c;它主要完成驱动程序的装载和建立新的数据库连接。其常用方法如下&#xff1a;* getConnection (Stri…

只读事务上下文_我可以/应该在事务上下文中使用并行流吗?

只读事务上下文介绍 长话短说&#xff0c;您不应在并行流中使用事务。 这是因为并行流中的每个线程都有其自己的名称&#xff0c;因此它确实参与了事务。 Streams API旨在在某些准则下正常工作。 实际上&#xff0c;为了受益于并行性&#xff0c;不允许每个操作更改共享对象的…

mysql多表查询详解_MySQL多表查询详解上

时光在不经意间&#xff0c;总是过得出奇的快。小暑已过&#xff0c;进入中暑&#xff0c;太阳更加热烈的绽放着ta的光芒&#xff0c;...在外面被太阳照顾的人们啊&#xff0c;你们都是勤劳与可爱的人啊。在房子里已各种姿势看我这篇这章的你&#xff0c;既然点了进来&#xff…