跳到主要内容

JEP 148:小型虚拟机

概括

支持创建不大于3MB的小型虚拟机。

目标

进行必要的修改,以便我们可以选择构建不大于 3MB 的小型 VM。 (作为参考,客户端和服务器 VM 目前分别约为 6 MB 和 9 MB。)

这将通过允许在构建时排除某些功能以及在可能的情况下优化 C++ 编译代码的空间来实现。小型 VM 的性能下降最多 5% 是可以接受的。非小型构建不得出现性能下降。

非目标

没有计划保留全部能力。没有计划使功能在运行时可选。

成功指标

大小libjvm.so小于3MB,性能下降不超过5%。

动机

小型设备具有非常严格的静态和动态内存占用要求。为了使 Java 在此类设备上正常工作,我们需要减少 JRE 的总体静态和动态占用空间。

描述

早期在实现Java 内核libjvm.so时曾采取过减小大小的努力。内核 VM 删除了许多较大的组件,例如额外的垃圾收集器、C2 JIT 和大部分 JVMTI。

内核虚拟机尚未得到维护,也从未在 Linux 上实现。该项目的第一步是恢复 Linux 虚拟机的等效功能。

在内核 VM 中,修改了 makefile 和相关构建文件,以排除所需功能不需要的文件。我们正在采取稍微不同的方法,并计划使用条件修改源文件,而不是修改构建文件。现有的条件符号KERNEL将变成MINIMAL_JVM,并且内核VM排除的源文件将被包围#ifndef MINIMAL_JVM。此外,为了更好地控制最小 VM 符号中包含的内容,例如INCLUDE_\<something>将被定义为包含否则将被排除的功能。对于最小的 VM,将不会定义这些符号。

一旦最小的虚拟机在必要的平台上稳定下来,其他不必要的功能将成为可选的。我们认为可以做到这一点的主要方法是从最小 VM 中删除 JVMTI、java.lang.instrument支持(在 中实现sun.instrument)、sun.management以及监视(在 中实现)。PerfDataManager

大部分 JVMTI 已从内核 VM 中删除。剩余的 JVMTI 代码将在构建时以#ifdef' 为条件。

已删除功能的公共 API 可能需要修改,以便在未实现时抛出适当的异常。

该项目的另一部分包括查找可以在不牺牲性能的情况下优化空间的文件。这涉及修改构建过程,以便轻松指定要优化空间的文件。 gcc 选项-Os是我们对大多数文件使用的选项,以优化空间。可能还有其他选项可以减少某些平台上的空间。如果性能显着下降,将使用分析来确定可以编译哪些文件以-O3加快速度。这可能涉及将函数移动到不同的文件,以便仅以这种方式编译性能所需的函数。

测试

如果缺少底层实现代码,API 的行为必须正确。更改必须通过 Java SE 8 TCK。需要进行性能测试来衡量减少工作的影响。

风险和假设

虚拟机可能依赖于我们不知道的已删除功能。

有可能,但不太可能,没有足够的可选功能可以删除以实现我们的目标。

假设 JDK 8 不会显着增加libjvm.so.

影响

  • 其他 JDK 组件:某些工具可能依赖于缺失的代码。

  • 兼容性:最小二进制文件不支持 JVMTI。

  • 性能/可扩展性:构建此配置时可能会测量到对性能的一些轻微影响。

  • 文档:需要记录二进制文件中不支持的内容,以及如果用户或工具尝试访问缺少的功能会发生什么。

  • TCK:可能需要进行一些 TCK 更改来支持因删除功能而导致的 API 更改。

  • QA:需要额外的测试来确保小型二进制文件正常工作。可能需要更新测试以考虑可选功能。

  • 用户体验:用户可能期望所有虚拟机都具有完整的功能,但小型虚拟机将省略某些功能。