2

我需要尝试改善相对较大的无头Java 应用程序调整 VM/启动器参数的启动时间(正在单独努力实现调整实际代码的相同目标)。

选择的 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)

主机是运行 Linux 的嵌入式 ARM7(32 位)。

model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40

如前所述,目标是缩短启动时间;运行时性能是可以接受的。

有人可以建议对 VM 本身进行调整以显着缩短交货时间。

注意:我知道“-client”选项可能带来的好处,我会尽快试用它;有可能的缺点吗?任何其他?

澄清:

“有趣的数字”是从目标上电到应用程序准备好接受命令所需的时间。

它由三部分组成:

  • 系统启动时间:超出了这个问题的范围。唯一的影响是 Java 很早就启动了,所以其他一些后台进程可能正在窃取计算能力;也许某些优先级扩展可能会有所帮助,但会牺牲其他一些过程。
  • Java VM 启动:这是本题的重点。
  • 应用程序启动时间:这应该在优化中计算,但应用程序优化本身(例如:“未使用”类的延迟加载)不是这个问题的一部分。但是应该记住,因为任何缩短 VM 启动的解决方案时间,但延长应用程序启动时间并没有多大帮助。
4

1 回答 1

3

1. AOT 编译 ($$$)

根据您的口袋有多深,您可以尝试支持 ARM 架构的Excelsior JET编译器。编译该批次并为该平台大幅简化和优化可执行文件,从而大大减少 JVM 的启动时间。提供 180 天免费试用,足以评估该选项。

2. 紧凑型配置文件(免费)

Java SE 8 Embedded具有紧凑型配置文件。您的 JVM 启动日志表明您的应用程序使用compact3(3 个中最大的一个)。

每个配置文件本质上是一组 Java API(以及相关的类),compact3包含来自compact2的所有 API 以及附加项,而compact2包含来自compact1的所有 API 以及附加项。

当您从指定配置文件之外使用 API 时,运行javac -profile 2(甚至)会显示错误。将显示您使用的每个 API 的配置文件。也许您可以避免使用来自更高配置文件的 API,从而允许将您的应用程序编译为较低配置文件的 API。这将导致引导程序/系统类加载器加载的类更少,因此 JVM 启动更快。请参阅此处了解更多信息。-profile 1jdeps -P

3. 编译自己的JVM(免费,复杂)

本演示文稿中的广泛知识(也围绕紧凑型配置文件进行了讨论)

4. Java 9 模块(免费但处于 alpha 阶段)

我不确定是否存在 JVM 9 到 ARM 的成功移植。Azul Systems 的 Zulu仅支持Java 8OpenJ9是 Eclipse 的努力,但它的 ARM 端口似乎仍然有点实验性。看一下,也许您可​​以为您的应用程序获得一些牵引力。

这将需要在您的代码库中创建模块并仅使用您的应用程序使用的模块构建 JRE。

于 2018-05-11T11:02:58.577 回答