如何减少OpenJDK Java8虚拟机的启动时间?

如何减少OpenJDK Java8虚拟机的启动时间?,java,optimization,app-startup,Java,Optimization,App Startup,我需要尝试通过调整VM/launcher参数来提高相对较大的无头java应用程序的启动时间(另外一项工作正在进行中,以实现调整实际代码的相同目标) 选择的虚拟机是标准的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, interpr

我需要尝试通过调整VM/launcher参数来提高相对较大的无头java应用程序的启动时间(另外一项工作正在进行中,以实现调整实际代码的相同目标)

选择的虚拟机是标准的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
如前所述,目标是缩短启动时间;运行时性能是可以接受的

是否有人可以建议对虚拟机本身进行调整,以显著缩短交付周期

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

澄清:

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

这由三部分组成:

  • 系统启动时间:超出此问题的范围。唯一的影响是Java启动得很早,所以其他一些后台进程可能正在窃取计算能力;也许一些优先级扩展会有所帮助,但会牺牲一些其他流程
  • JavaVM启动:这是这个问题的主要焦点
  • 应用程序启动时间:这应该在优化中计算,但应用程序优化本身(例如,“未使用”类的延迟加载)不是这个问题的一部分。但是,应该记住这一点,因为任何缩短VM启动时间但延长应用程序启动时间的解决方案都不会有多大帮助
1.AOT编译($$) 根据您的口袋有多深,您可以尝试使用支持ARM体系结构的编译器。编译大量代码,并为平台提供高度简化和优化的可执行文件,大大缩短JVM的启动时间。180天免费试用,足以评估该选项

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

每个概要文件本质上是一组Java API(因此也是相关的类),compact3包含来自compact2的所有API(添加),而compact2包含来自compact1的所有API(添加)

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

3.编译自己的JVM(免费、复杂) 广泛的知识(还讨论了紧凑型配置文件

4.Java 9模块(免费但alpha阶段) 我不确定是否有成功的JVM 9到ARM的端口。仅取决于Java 8。然而,Eclipse的工作是这样的。看一看,也许您可以为您的应用程序获得一些动力


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

问题是JVM本身的启动时间,还是应用程序的启动时间(包括JVM启动时间)?@Michael:我编辑了这个问题以澄清问题。不幸的是,我没有更改VM的自由(和/或使用AOT)。我将调查您的选项2,这是目前我唯一可以使用的选项。我还将尝试使用选项1“评估”,如果收益可观,我将尝试将升级出售给我的上司(尽管我在那里的机会很少,而且这不是成本问题)。如果其中任何一个选项被证明是有用的,我将接受你的答案。@ZioByte“如果其中任何一个选项被证明是有用的,我将接受你的答案”。接受它吧……这是一个包含大量信息的好答案。