首页 > 解决方案 > JVM启动时如何预加载使用的类?

问题描述

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

我尝试了强制加载方法的属性

-XX:CompileThreshold=0 -XX:TieredCompilation

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

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

在 jar 启动时预加载 java 类/库?

最小化Java“热身”时间的技术或实用程序?

标签: javajvmjithotspotwarm-up

解决方案


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

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

AOT 编译的好处是更快的 JVM 启动。缺点是 AOT 编译器在优化方面不如 JIT 编译器,因此在长时间运行的程序中整体性能会受到影响。

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

附加参考:


推荐阅读