JVM启动时如何预加载使用的类?

问题描述

我正在用Java开发消息传递系统,该系统需要低延迟处理(不到1秒)。但是,JVM需要花费预热时间来处理导致延迟增加的第一个输入数据(大约2到3秒)。延迟增加的主要原因是类加载。我知道最简单的解决方案是使用伪消息提前调用方法。但是,由于系统要求,我无法使用虚拟消息来预热JVM 。因此,我想知道在JVM启动时预加载所有使用的类的方法

我尝试通过属性强制加载方法

-XX:CompileThreshold=0 -XX:TieredCompilation

但是,它似乎运行不佳。 JVM在调用类时仍会加载类。

我还阅读了其他线程,但是没有人指定在JVM启动时预加载类的方法

Preloading java classes/libraries at jar startup?

Technique or utility to minimize Java "warm-up" time?

解决方法

我认为您需要使用提前(AOT)Java编译器,将类编译为可以由JVM加载的本机代码。

一个示例是JEP 295工作在Java 9中引入的jaotc工具。它获取一个类列表(以前已编译为字节码文件),并将其编译为本地代码库。例如Linux .so文件。然后,您可以在命令行上告诉JVM .so文件,它将加载AOT编译的代码并使用它。

AOT编译的好处是可以更快地启动JVM。缺点是AOT编译器的优化工作不如JIT编译器,因此,长时间运行的程序会降低整体性能。

因此,您(显然)需要满足快速启动要求,可能会导致您不满足长期吞吐量要求。

其他参考: