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

标签 java jvm jit jvm-hotspot warm-up

我正在使用 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 加载的 native 代码。

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

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

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

其他引用资料:

关于java - JVM启动时如何预加载使用过的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64533458/

相关文章:

java - minSDKversion 15 无法在 Android 设备版本 : 4. 3 上运行

java - DVM确保多个实例在单个设备上高效运行!这意味着什么?

python - Numba:如何以编程方式打开/关闭即时编译(设置 NUMBA_DISABLE_JIT 环境变量)?

java - Spring MVC : Automatically return back to the same page upon binding errors

java - 从单独的类获取对象的引用

javascript - 如何使用泛型在 TypeScript 中模拟 Java getClass()?

Java 字节码缺少局部变量表

java - Eclipse:无法加载 JNI 共享库

java - 为什么 getSum 没有被热点 jvm 内联?

java - 我可以强制 JVM 本地编译给定的方法吗?