堆快照
2020 年 8 月 26 日这里介绍的工作是作为 Oracle、乌普萨拉大学和 KTH 之间的联合研究项目的一部分进行的。关注 inside.java 上的博客系列,了解更多关于在斯德哥尔摩的 Oracle 开发办公室进行的 JVM 研究。
嗨!我是 Ludvig,来自斯德哥尔摩的计算机科学学生。我目前正在完成我的 5 年制教育,重点是理论计算机科学,并向专业工作迈进。我的背景包括组织黑客马拉松和年度 djulkalendern CTF 挑战的志愿者工作,在巴塞罗那的交流,创业工作,增强现实的研发,以及在 KTH 的各种课程中的助教职位,包括算法和交互式编程。我今年夏天的目标包括更深入地学习 Rust 和 Clojure。
在我的 Oracle 硕士论文中,我研究了“堆快照”,这是一种可能减少 JVM 启动时间的方案。总的来说,鉴于 JVM 初始化需要很长时间,但被认为是相当确定的,我们不能在初始化结束时对整个堆进行快照,并在下次启动时直接从该初始化状态开始吗?我们可能需要做一些“修复程序”来确保快照能够实际启动,但假设这些程序不会花费太多时间,它应该可以节省启动时间。
那么,这可以做到吗?或者 JVM 太复杂了,无法支持这种粗略的操作?实际情况下的时间结果如何?
事实证明,这是可以做到的,因为我已经能够实现这样的恢复。快照是在非常早的时候拍摄的,在函数 Threads::initialize_java_lang_classes 中,并且使用 Epsilon GC 来简化处理,以避免处理任何垃圾收集,并获得一个连续的堆。还有许多其他类似的简化,修复这些问题留待以后的工作。
问题是,这样的快照是否稳定。我们能否相信恢复的状态将正常工作?我们有充分的理由怀疑,但我的实现通过了 OpenJDK 发行版中包含的所有相关测试,以及在运行它的几个应用程序上的测试。
另一个积极的,也是意料之外的结果是,即使在这个小型原型中,也有一些微不足道的性能提升。也就是说,快照节省的时间大于加载快照并修复它所需的时间。即使没有这种情况,我也会对自己的工作感到满意,但看到这种情况还是挺好的。
然而,预计更大的结果将在未来有人继续我的工作时出现。堆快照点(参见插图)可以并且应该在时间线上推迟。快照覆盖的每个后续步骤意味着在初始化方面节省更多时间。长远目标不仅是快照 JVM 初始化,而且是通过向程序员公开的 API 快照 Java 中实际程序的确定性部分。也许甚至可以有一个完整的类型系统,用于标记状态的非确定性部分和其他敏感内容,以便自动删除?
虽然不得不在我刚学会调试 JVM 中的错误并不断推动快照点时停止工作感觉很不好,但我的硕士论文阶段已经结束了。我相信它将在未来落入有能力的人手中,因为 Oracle 已经计划引进更多硕士生。最后,我在 Oracle 工作期间学到了很多东西,与斯德哥尔摩 JPG 办公室的人们一起,我无法想象一个更好的硕士论文阶段。
至于我为什么选择 Oracle 作为我的论文,我承认我一开始持怀疑态度,因为它是一家非常大的公司。然而,我碰巧在职业生涯博览会晚宴上与 Oracle 的几位工程师坐在一起,我被他们表现出的轻松能力所吸引。我确实感觉到这些人是真正的专家,我肯定可以从他们那里学到很多东西。最后,事实证明 Oracle 的提议最适合我的技能,因此,在个人经历的激励下,我接受了他们的提议,并没有失望。
最后,我要感谢斯德哥尔摩 JPG 办公室的所有人,感谢他们的耐心,愿意分享知识,以及让我感觉自己是团队中的一员。我特别感谢 Ioi Lam 和 Tobias Wrigstad 的投入时间。没有他们,我的论文结果是不可能实现的。