JVM启动时如何预加载used类



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

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

-XX:CompileThreshold=0 -XX:TieredCompilation

然而,它似乎运行不太好。JVM在调用类时仍然加载这些类。

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

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

最小化Java的技术或实用程序";"预热";时间

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

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

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

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

附加参考:

  • "jaotc命令"-Oracle命令文档
  • "提前编译(AoT("-关于使用jaotc的教程

最新更新