我正在使用 Java 开发一个消息传递系统,需要低延迟处理(低于 1 秒)。然而,JVM 需要预热时间来处理第一个输入数据,导致延迟增加(大约 2~3 秒)。延迟增加的主要原因是类加载。我知道最简单的解决方案是使用虚拟消息提前调用方法。但是,由于系统要求,我无法使用虚拟消息来预热 JVM。所以我想知道JVM启动时预加载所有使用的类的方法。
我尝试了强制加载方法的属性
-XX:CompileThreshold=0 -XX:TieredCompilation
但是,效果似乎不太好。当调用类时,JVM 仍然会加载类。
我也阅读了其他线程,但没有人指定 JVM 启动时预加载类的方法。
最佳答案
我认为您需要使用提前 (AOT) Java 编译器,将类编译为可由 JVM 加载的 native 代码。
一个例子是 Java 9 中引入的 jaotc
工具,该工具是 JEP 295 的结果。工作。它获取类列表(之前已编译为字节码文件)并将它们编译为 native 代码库;例如Linux .so
文件。然后,您可以在命令行上告诉 JVM 有关 .so
文件的信息,它会加载 AOT 编译的代码并使用它。
AOT 编译的优点是 JVM 启动速度更快。缺点是 AOT 编译器无法像 JIT 编译器那样做好优化工作,因此在长时间运行的程序中整体性能会受到影响。
因此,您(明显)需要满足快速启动要求可能会导致您无法满足长期吞吐量要求。
其他引用资料:
- "The jaotc Command" - Oracle 命令文档。
- "Ahead of Time Compilation (AoT)" - 使用
jaotc
的教程。
关于java - JVM启动时如何预加载使用过的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64533458/