JVM启动时如何预加载used class?

How to preload used class when JVM starts?

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

我尝试通过

强制加载方法的属性
-XX:CompileThreshold=0 -XX:TieredCompilation

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

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

Preloading java classes/libraries at jar startup?

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

我认为您需要使用 ahead-of-time (AOT) Java 编译器将 类 编译为可由 JVM 加载的本机代码。

一个例子是 jaotc 工具,作为 JEP 295 工作的结果在 Java 9 中引入。它获取 类 列表(之前编译为字节码文件)并将它们编译为本机代码库;例如一个 Linux .so 文件。然后你可以在命令行告诉JVM关于.so文件,它会加载AOT编译代码并使用它。

AOT 编译的好处是 JVM 启动更快。缺点是 AOT 编译器无法像 JIT 编译器那样进行优化,因此在较长的 运行 程序中整体性能会受到影响。

所以您(明显的)需要满足快速启动要求可能会导致您无法满足 long-term 吞吐量要求。

其他参考资料: