如何减少 OpenJDK Java8 VM 的启动时间?
How to reduce startup time for OpenJDK Java8 VM?
我需要尝试改进相对较大的 headless java 应用程序调整 VM/launcher 参数的启动时间(正在进行单独的努力以实现调整实际代码的相同目标)。
选择的 VM 是标准的 OpenJDK Java-8.
openjdk version "1.8.0_102-internal"
OpenJDK Runtime Environment (build 1.8.0_102-internal-b14, profile compact3)
OpenJDK VM (build 25.102-b14, interpreted mode)
主机是嵌入式ARM7(32位)运行 Linux.
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40
如前所述,目标是缩短启动时间;运行时性能是可以接受的。
有人可以建议调整 VM 本身以显着缩短交付时间。
注意:我知道“-client”选项可能带来的好处,我会尽快试用它;有可能的缺点吗?还有其他吗?
澄清:
"interesting number" 是从目标加电到应用程序准备好接受命令所需的时间。
本文由三部分组成:
- 系统启动时间:不在本题讨论范围内。唯一的影响是 Java 启动得比较早,所以其他一些后台进程可能会窃取计算能力;也许某些优先级缩放会有所帮助,但会牺牲一些其他进程。
- Java虚拟机启动:这是本题的重点
- 应用程序启动时间:这应该在优化中计算,但应用程序优化本身(例如:延迟加载"unused" 类”)不是这个问题的一部分。它应该保留但是请记住,因为任何缩短 VM 启动时间但延长应用程序启动时间的解决方案都无济于事。
1. AOT 汇编 ($$$)
看你的钱有多深,你可以尝试 Excelsior JET 支持 ARM 架构的编译器。编译大量并为平台大量简化和优化可执行文件,大大减少 JVM 的启动时间。提供 180 天免费试用,足以评估该选项。
2。紧凑配置文件(免费)
Java SE 8 Embedded 具有 Compact Profiles。您的 JVM 启动日志表明您的应用程序使用 compact3(3 个中最大的一个)。
每个配置文件本质上是一组 Java API(因此相关 类)并且 compact3 包含所有 APIs 来自 compact2 添加,而 compact2 包含来自 compact1 的所有 APIs添加。
运行 javac -profile 2
(甚至 -profile 1
)会在您从指定配置文件之外使用 API 时向您显示错误。 jdeps -P
将显示每 API 消耗的个人资料。也许您可以避免使用较高配置文件中的 API,从而允许您的应用程序被编译为较低配置文件 API。这将导致 bootstrap/system 类加载器加载的 类 更少,因此 JVM 启动更快。有关详细信息,请参阅 here。
3。编译你自己的 JVM(免费,复杂)
广博的知识in this presentation(也讨论了紧凑的配置文件)
4。 Java 9 个模块(免费但处于 alpha 阶段)
我不确定是否存在JVM 9 到ARM 的成功移植。 Azul Systems' Zulu is only up to Java 8. OpenJ9 is Eclipse's effort however ARM port of it seems a bit experimental still。看看,也许您可以为您的应用程序带来一些吸引力。
这将需要在您的代码库中创建模块并仅使用您的应用程序使用的模块来构建 JRE。
我需要尝试改进相对较大的 headless java 应用程序调整 VM/launcher 参数的启动时间(正在进行单独的努力以实现调整实际代码的相同目标)。
选择的 VM 是标准的 OpenJDK Java-8.
openjdk version "1.8.0_102-internal"
OpenJDK Runtime Environment (build 1.8.0_102-internal-b14, profile compact3)
OpenJDK VM (build 25.102-b14, interpreted mode)
主机是嵌入式ARM7(32位)运行 Linux.
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40
如前所述,目标是缩短启动时间;运行时性能是可以接受的。
有人可以建议调整 VM 本身以显着缩短交付时间。
注意:我知道“-client”选项可能带来的好处,我会尽快试用它;有可能的缺点吗?还有其他吗?
澄清:
"interesting number" 是从目标加电到应用程序准备好接受命令所需的时间。
本文由三部分组成:
- 系统启动时间:不在本题讨论范围内。唯一的影响是 Java 启动得比较早,所以其他一些后台进程可能会窃取计算能力;也许某些优先级缩放会有所帮助,但会牺牲一些其他进程。
- Java虚拟机启动:这是本题的重点
- 应用程序启动时间:这应该在优化中计算,但应用程序优化本身(例如:延迟加载"unused" 类”)不是这个问题的一部分。它应该保留但是请记住,因为任何缩短 VM 启动时间但延长应用程序启动时间的解决方案都无济于事。
1. AOT 汇编 ($$$)
看你的钱有多深,你可以尝试 Excelsior JET 支持 ARM 架构的编译器。编译大量并为平台大量简化和优化可执行文件,大大减少 JVM 的启动时间。提供 180 天免费试用,足以评估该选项。2。紧凑配置文件(免费)
Java SE 8 Embedded 具有 Compact Profiles。您的 JVM 启动日志表明您的应用程序使用 compact3(3 个中最大的一个)。
每个配置文件本质上是一组 Java API(因此相关 类)并且 compact3 包含所有 APIs 来自 compact2 添加,而 compact2 包含来自 compact1 的所有 APIs添加。
运行 javac -profile 2
(甚至 -profile 1
)会在您从指定配置文件之外使用 API 时向您显示错误。 jdeps -P
将显示每 API 消耗的个人资料。也许您可以避免使用较高配置文件中的 API,从而允许您的应用程序被编译为较低配置文件 API。这将导致 bootstrap/system 类加载器加载的 类 更少,因此 JVM 启动更快。有关详细信息,请参阅 here。
3。编译你自己的 JVM(免费,复杂)
广博的知识in this presentation(也讨论了紧凑的配置文件)
4。 Java 9 个模块(免费但处于 alpha 阶段)
我不确定是否存在JVM 9 到ARM 的成功移植。 Azul Systems' Zulu is only up to Java 8. OpenJ9 is Eclipse's effort however ARM port of it seems a bit experimental still。看看,也许您可以为您的应用程序带来一些吸引力。
这将需要在您的代码库中创建模块并仅使用您的应用程序使用的模块来构建 JRE。