微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决JVM启动时如何预加载使用的类?

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

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

AOT编译的好处是可以更快地启动JVM。缺点是AOT编译器的优化工作不如JIT编译器,因此,长时间运行的程序会降低整体性能。

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

其他参考:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。