跳到主要内容

JEP 341:默认 CDS 存档

QWen Max 中英对照 JEP 341 Default CDS Archives

概述

增强 JDK 构建过程,以便在 64 位平台上使用默认类列表生成类数据共享 (CDS) 存档。

目标

  • 提升开箱即用的启动时间
  • 消除用户运行 -Xshare:dump 以从 CDS 中受益的需求

非目标

  • 我们将仅为本地构建生成默认存档,而不为交叉编译的构建生成。
  • 我们将仅为 64 位构建生成默认存档;对 32 位构建的支持可能会稍后添加。

动机

自 JDK 8u40 以来,基础 CDS 功能得到了许多增强。启用 CDS 所带来的启动时间缩短和内存共享优势显著增加。在 Linux/x64 上使用 JDK 11 早期访问版本 14 进行的测量显示,运行 HelloWorld 时启动时间减少了 32%。在其他 64 位平台上,观察到了类似或更高的启动性能提升。

目前,JDK 镜像在 lib 目录中包含一个默认的类列表,该列表是在构建时生成的。想要利用 CDS(即使仅使用 JDK 中提供的默认类列表)的用户必须执行 java -Xshare:dump 作为额外的步骤。此选项在文档中有说明,但许多用户并不知晓。

描述

修改 JDK 构建过程,以便在链接镜像后运行 java -Xshare:dump。(可以添加额外的命令行选项来微调 GC 堆大小等,从而为常见场景获得更好的内存布局。)将生成的 CDS 存档保留在 lib/server 目录中,使其成为最终镜像的一部分。

用户将自动受益于 CDS 功能,因为在 JDK 11 中,默认情况下服务器 VM 已启用 -Xshare:autoJDK-8197967)。要禁用 CDS,请使用 -Xshare:off 运行。

具有更高级需求的用户(例如,使用包含应用程序类的自定义类列表、不同的 GC 配置等)仍可以像以前一样创建自定义 CDS 存档。

替代方案

构建默认的 CDS 存档,但禁用 -Xshare:auto

这种方法会更安全。在 Windows 上,CDS 在许多版本中已经默认启用,因为默认的 CDS 存档是由 JDK Windows 安装程序创建的,但其他平台并非如此。如果我们在用户未作出明确选择的情况下突然启用 CDS,那么现有的应用程序可能会受到影响,例如,如果它们依赖于 JVM 启动序列的未记录方面。

如果禁用了 -Xshare:auto(即,我们回退了 JDK-8197967),那么即使默认的 CDS 存档包含在 JDK 中,用户也需要在命令行中显式指定 -Xshare:auto 才能使用 CDS。这将为用户提供一个适应默认 CDS 存档的过渡期,之后我们可以在未来的版本中重新实施 JDK-8197967。

这种方法的优势在于:

  • 它不会立即改变默认行为。
  • 通过消除常见情况下的 java -Xshare:dump 步骤,它提高了使用默认存档的 CDS 可用性。
  • 通过在不立即改变默认行为的风险下向用户提供默认存档,它提供了更多的测试曝光。

这种方法存在的问题包括:

  • 我们将在 -Xshare:auto 之间来回切换,这会引起混淆。
  • 这一做法基于一个错误的假设,即包含 CDS 存档具有高风险。CDS 默认存档在 Windows(客户端)上已经启用了十多年,很少出现问题。
  • 用户只有在明确开启 -Xshare:auto 选项时才能测试此功能。然而,那些关心(或了解)CDS 的用户可能已经创建了 CDS 存档,并针对之前的版本修改了他们的命令行,这意味着他们已经在没有我们提供默认存档的情况下测试了 CDS。这种方法是否真的会带来更多的测试,令人怀疑。

相比之下,使用此 JEP 中提出的方法,许多开发者在构建 JDK 或使用早期访问版本时会隐式测试 CDS,这显然会带来更多的测试。

测试

现有的启用了 CDS 的自动化测试已经足够。