java - JVM启动时如何预加载使用的类?
问题描述
我正在使用 Java 开发一个需要低延迟处理(不到 1 秒)的消息传递系统。但是,JVM 需要预热时间来处理导致延迟增加的第一个输入数据(大约 2~3 秒)。延迟增加的主要原因是类加载。我知道最简单的解决方案是使用虚拟消息提前调用方法。但是,由于系统要求,我不能使用虚拟消息来预热 JVM 。所以我想知道在JVM启动时预加载所有使用的类的方法。
我尝试了强制加载方法的属性
-XX:CompileThreshold=0 -XX:TieredCompilation
但是,它似乎运行得并不好。JVM 在调用类时仍会加载它们。
我还阅读了其他线程,但没有人指定在 JVM 启动时预加载类的方法。
解决方案
我认为您需要使用提前 (AOT) Java 编译器,将类编译为可由 JVM 加载的本机代码。
一个例子是作为JEP 295工作jaotc
的结果在 Java 9 中引入的工具。它需要一个类列表(之前编译为字节码文件)并将它们编译为本机代码库;例如 Linux文件。然后,您可以在命令行上告诉 JVM 该文件,它会加载 AOT 编译的代码并使用它。.so
.so
AOT 编译的好处是更快的 JVM 启动。缺点是 AOT 编译器在优化方面不如 JIT 编译器,因此在长时间运行的程序中整体性能会受到影响。
因此,您(明显)需要满足快速启动要求可能会导致您无法满足长期吞吐量要求。
附加参考:
- “jaotc 命令” - Oracle 命令文档。
- “Ahead of Time Compilation (AoT)” - 使用
jaotc
.
推荐阅读
- java - LeapMotion 无法识别任何手势
- java - 如何使用 RecyclerView 中当前项目的视图?
- java - mule4 dataweave 2.0 写入只有标题的 csv 文件
- sas - 如何尽快拆分大数据集
- java - Tomcat8.5 和 Openjdk11 NoClassDefFoundError: 无法初始化类 org.apache.cxf.attachment.AttachmentUtil
- java - 我可以替换构造函数中的getter函数(例如用super)吗?如何替换?
- python - 如何在使用带有 lambda 表达式的 pandas 应用函数时消除类型错误
- swift - 如何快速将 UIView 绘图转换为 GLKView?
- cakephp - 带有 CASE WHEN THEN ELSE 条件的 CakePHP 查询
- c++ - 使用 ffh.getFieldType() == "/Btn" 和 qpdf lib 检查复选框