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

通过Main的Checkpoint Restore加快Java启动速度相关推荐

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

    checkpoint Java虚拟机为已编译为字节码 (但不一定是用Java编写)的应用程序提供了托管运行时环境. 与为特定平台静态编译的代码相比,这为应用程序开发人员提供了许多好处,并且通常可以提高 ...

  2. Android应用性能优化(3)---加快应用启动速度

    Android性能优化之加快应用启动速度 应用的启动 启动方式 通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进 ...

  3. main方法中args_public static void main(String [] args)– Java main方法

    main方法中args public static void main(String[] args) is the most important Java method. When you start ...

  4. 电脑开机计算机打开盘慢,电脑开机太慢了?教你4个方法,轻松加快Windows启动速度!...

    原标题:电脑开机太慢了?教你4个方法,轻松加快Windows启动速度! 最近有位朋友升级win10系统之后,电脑启动变慢,想知道如何解决.其实,电脑启动速度慢的原因比较多,一般可以简单分为硬件和系统两 ...

  5. 12306给自家技术团队打90分;Oracle 加快 Java 迭代速度

    (点击上方蓝字,快速关注我们) 转自:开源中国.solidot.cnBeta.腾讯科技等 0.最高峰抢票时段平稳度过,12306 技术团队为自己打 90 分以上 据中国之声<全国新闻联播> ...

  6. java代码中何处以main开始,Gradle-user guide-第7章 Java 快速开始

    第7章java快速开始 7.1java插件 我们知道,Gradle是一个多用途的构建工具,它可以构建你想在构建脚本中实现的任何事情.不过,作为开箱即用的产品,它不会做任何构建脚本不包含的任务. 大多数 ...

  7. java中哪个是main函数的合法参数,Java试卷及答案

    广东商学院试题纸 2009-2010学年第2学期考试时间共120 分钟 课程名称面向对象程序设计(样题) ----------------------------------------------- ...

  8. java main函数_都知道Java程序的入口方法是main,那你知道为什么是main方法吗?

    我们都知道Java的入口方法是main函数,下面这段代码就是Java中非常经典的Hello World代码: 我们通过Java提供的工具进行编译执行: 通过上面的代码我们知道Java入口方法的几个要求 ...

  9. java main spring_分享通过在java main函数中执行spring的代码

    脱离tomcat容器在单独的java application的main函数中初始化spring Main.java package com.zuidaima.test; import org.spri ...

最新文章

  1. 使用 USB 设备安装 Windows 10虚拟机
  2. 电脑无线网络显示红叉_不能播放视频怎么办?小编教你电脑不能播放视频如何解决...
  3. python flask 获取 get post 参数
  4. python pip install pipenv失败_pipenv 无法创建依赖情况应该怎么处理?大家有什么好的建议吗?...
  5. 你真的知道 NoSuchMethodError 发生原因和解决办法吗
  6. 前端也要会的数据结构 (不定期更新篇)
  7. 会话跟踪技术之Cookie
  8. 使用Blink CEP实现差值聚合计算
  9. c++ 返回string_JVM系列之:String.intern和stringTable
  10. 地址url的split()方法使用;
  11. Google Protocol Buffers浅析(四)
  12. python如何统计累计每日的人数‘’_每日一练 | Data Scientist amp; Business Analyst amp; Leetcode 面试题 902...
  13. android 头像修改
  14. java saxreader 字符串_解析XML文件(字符串)的方法-----SAXReader
  15. 2022-4-23基于单片机的酒驾检测报警系统(MQ3酒精传感器)(风吹摇铃 奔赴星海)
  16. N-gram 特征提取
  17. 计算机图形学之绘制旗子
  18. JVM面试专题(上)
  19. 美国移民局宣布H-1b签证新规 高学历申请者受益
  20. 【bug记录】Vue项目执行报错处理:You may need an appropriate loader to handle this file type.

热门文章

  1. [XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)
  2. SpringCloud Ribbon(三)之IPing机制
  3. Redis 常用操作命令,非常详细
  4. 跟我学 Java 8 新特性之 Stream 流(五)映射
  5. ThreadLocal的非数据安全用法
  6. 小菜:Java异常处理的10个最佳实践
  7. 如何quot;优雅quot;地终止一个线程?
  8. 即日起,正式进入编程世界!
  9. 你胆敢在case后面不加break试试?
  10. 2015蓝桥杯省赛---java---B---7(牌型种数)