Java如何协调代码的快速启动和实时优化两者之间平衡?
Java虚拟机(JVM)的一个伟大之处在于,它能够使Java应用程序的性能适应其使用方式。
它可以找出你的代码中哪些部分是经常使用的,然后通过其及时编译代码的能力(JIT)来优化代码。
但这也意味着,它必须先弄清楚这些部分,然后才能将这些部分编译成更快的代码。
而这需要时间,也就是说,你不能简单地运行你的代码,并认为JVM会立即优化它,使其运行得尽可能快。
这是因为在你的应用程序能够以最佳状态运行之前,它需要时间来预热JVM。

现代应用两难
如果你有一个长期运行的应用程序,预热时间,可能在几秒钟到几分钟的范围内,通常没有问题。
但是,这些天来,Java应用程序经常被用于微服务环境,这意味着你可能有很多小的应用程序,它们只是运行了很短的时间,但会经常被重新启动。
在这种情况下,JVM的预热时间不是很有帮助,因为在微服务将被再次关闭之前,JVM可能甚至还没有预热好。

解决预热问题的一个方法是提前编译你的应用程序,并从中创建一个可以快速启动的本地镜像。
但原生镜像的缺点是,一旦你的代码被静态编译为原生代码,你就会失去JVM可以进行的运行时优化的能力。

检查点的协调恢复
那么问题来了,是否有办法保留JVM但减少其启动时间?

答案是,是的,有:使用CRaC,即检查点的协调恢复。
Azul公司的高级软件工程师Anton Kozlov是围绕这个主题的OpenJDK提案的幕后推手,你可以在相关的OpenJDK页面上找到更多关于这个项目的信息。

CRaC项目的重点是开发一个Java API,使得保存和恢复JVM的状态成为可能,包括当前运行的应用程序。
这个CRaC API是为了协调,加强检查点/恢复,尽管在技术上检查点/恢复在某些情况下不需要协调也可以实现。
使用这种方法可以使启动时间从几百秒大幅减少到几十毫秒。
该建议依赖于Linux CRIU(Coordinated Resume In Userspace)项目,加上其他额外的方法。

检查点的创建
这个想法是用你的应用程序启动JVM,并对其进行预热,直到它达到最佳性能。
一旦达到这个状态,你就创建一个JVM的快照,即所谓的检查点。
检查点的创建意味着JVM的当前状态将被保存到文件系统的一组文件中。
现在你可以将JVM从这组文件中恢复到一个正在运行的实例,但不需要对它进行预热。
如果你考虑到部署在容器化环境中的微服务,你可以考虑启动一个容器,在容器内预热JVM,并通过停止容器创建一个检查点。
下次你启动这个容器时,它就可以从存储的检查点恢复JVM。

CRaC API
创建检查点需要你的应用程序释放其资源,如数据库连接、HTTP连接和打开的文件,否则检查点图像可能因依赖可能消失的资源而过时。
拟议的CRaC API提供了一些方法来帮助你在创建检查点之前释放资源,并在恢复检查点的JVM之后连接你的资源。
首先,你需要实现 "jdk.crac "包中的资源接口。
这个接口提供了两个方法,"beforeCheckpoint() "和 “afterRestore()”。
为了使其工作,你还需要通过调用 "Core.getGlobalContext().register() "将你的资源注册到一个全局上下文:

public class Main implements Resource {

public Main() {
    Core.getGlobalContext().register(Main.this);
  }

@Override
  public void beforeCheckpoint(Context<? extends Resource> context) throws Exception {
    // Free your resources here
  }

@Override
  public void afterRestore(Context<? extends Restore> context) throws Exception {
    // Load your resources here
  }

}

为了能够检查一切是否按预期工作,目前的实现会在你有开放的资源时抛出异常,例如开放的套接字。
当你触发检查点时,JVM的堆将被清理和压缩,这样JVM就处于安全状态。

CRaC项目还处理由JVM产生的文件。
因为它依赖于CRIU,CRaC项目与CRIU捆绑在一起,这意味着你不需要手动安装它。

检查点可以通过shell中的jcmd工具来创建,也可以从代码本身调用Core.checkpointRestore()。
这将创建检查点并退出应用程序。
注册资源是通过在检查点创建前和检查点恢复后通知一个全局上下文来完成的。

入门

  1. 获取已经包含 CRaC 功能的OpenJDK 构建。
  2. 在 GitHub 上获取我创建的基本示例,让您了解 CRaC 的工作原理。

简而言之,该示例将每 5 秒调用一次循环。在该循环中,它将检查 100000 次,如果 1 - 100000 之间的随机数是素数。
在进行实际计算之前,它会检查结果是否已经在缓存中。
如果找到缓存中的数字,则直接返回结果,如果没有,则计算结果,将其放入缓存中,然后返回。
在查看应用程序性能时,这将导致与普通应用程序类似的行为。
一开始,缓存是空的,这导致每个数字至少计算一次。随着时间的推移,性能会提高,因为缓存会越来越满。
有关如何设置 CRaC 和运行示例的信息可以在自述文件中找到。
关于 CRaC 的更多信息可以在这里找到:https://openjdk.java.net/projects/crac/https://wiki.openjdk.java.net/display/crac

OpenJDK的“CRaC检查点协调恢复” - foojay相关推荐

  1. 具有检查点的恢复技术

    问题的提出 两个问题 搜索整个日志将耗费大量的时间 重做处理:重新执行,浪费了大量时间 解决方案 具有检查点(checkpoint)的恢复技术 在日志文件中增加检查点记录(checkpoint) 增加 ...

  2. flink 检查点_Flink检查点和恢复

    flink 检查点 Apache Flink is a popular real-time data processing framework. It's gaining more and more ...

  3. InfoQ 最新 Java 发展趋势报告

    我们关注 Java,以及 Kotlin 和 Scala 等相关语言.Java 虚拟机(JVM)和基于 Java 的框架和工具. 我们探讨 Java 最主要的趋势,如 Java 新版本的采用,以及 Ja ...

  4. flink故障恢复的流程(从检查点恢复状态)

    文章目录 (1)重启应用 (2)读取检查点,重置状态 (3)重放数据 (4)继续处理数据 在运行流处理程序时,Flink 会周期性地保存检查点.当发生故障时,就需要找到最近一次成功保存的检查点来恢复状 ...

  5. 数据库系统概论:第十章 数据库恢复技术

    事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元.事务处理(transaction processing)技术主要包括数据库恢复技术和并发控制技术. 10.1 事务的基本概念 事务:是用户定义 ...

  6. 存储引擎之必知必会 -- 检查点机制

    检查点机制 圆满事务:日志中记录了事务的开始和commit提交事务,这说明日志已经完整地记录了事务的所有更新活动. 中止事务:日志中记录了事务的开始记录,但没有日志的提交记录,这说明日志记录的事务没有 ...

  7. 『数据库』你以为删库跑路就能让你老板内(lei)牛(liu)满面--数据库的恢复技术

    数据库从入门到精通:戳我 文章目录 一. 事务的基本概念 1.事务 1.1what's the 事务: 1.2事务的定义 1.2.1 事务的显示定义 1.2.2 事务的隐式定义方式 2.事务的ACID ...

  8. (数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像

    文章目录 一:数据库恢复的实现技术 (1)数据转储(备份) A:转储的分类 ①:按照系统是否运行事物时分类 ②:按转储的范围分类 (2)登记日志文件 A:日志文件的内容 B:日志文件的作用 C:登记日 ...

  9. 【数据库】数据库恢复技术

    文来自[风骨散人] 合作整理 文章目录 一. 事务的基本概念 1.事务 1.1what's the 事务: 1.2事务的定义 1.2.1 事务的显示定义 1.2.2 事务的隐式定义方式 2.事务的AC ...

最新文章

  1. 如果地府需要一个后台管理系统,你会如何设计?
  2. python 类的继承,类中的函数调用以及类输入数组
  3. 胡扯JS系列-匿名函数的自动运行
  4. Docker容器的备份和还原
  5. dell跳过开机硬件检测_移动工作站DELL Precision 7740评测连载2:开机初测
  6. 省选+NOI 第三部分 树上问题
  7. 智能会议系统(16)---LinphoneService
  8. CF 799B T-shirt buying
  9. 自制计算器(C语言的简单实现)(可多次使用)
  10. GB2312 一二级中文汉字字库(带拼音)
  11. uni-app 开发跨平台应用前端框架
  12. 验证座机号码是否输入格式正确
  13. 超详细纯前端导出excel并完成各种样式的修改(xlsx-style)
  14. openbmc开发30:webui开发—基础
  15. 【TAPD】快速上手
  16. python中对称差_python 合集set,交集,并集,差集,对称差集别搞混
  17. JavaSE基础之(十六)final关键字
  18. DASFAA 2023|创邻周研博士分享前沿图数据库观点
  19. 图像分析之曲率滤波(困惑篇)
  20. 202012-当我谈跑步时我谈些什么

热门文章

  1. 大端和小端的含义及判断代码
  2. 强制删除|病毒清除好帮手Unlocker
  3. 水仙花c语言代码3位数,3位数水仙花数C语言的问题
  4. pychon假消息生产器
  5. ! [rejected] master - master (fetch first) error: failed to push some refs to 'https://gith
  6. 论文阅读:Deep Learning–Based Segmentation andQuantification in Experimental Kidney Histopathology
  7. 支付宝支付成功后通知在微信打开的提示页面
  8. Fanuc机器人 Karel 编程学习(一)---ROBOGUIDE创建WorkCell
  9. opencv加法和和numpy加法的比较-04
  10. glob匹配多级目录