如何预热java类以避免首次调用缓慢?

Ybr*_*bri 13 java performance spring spring-boot

我正在做一个项目,我需要所有 API 调用的时间少于 1 秒,但我面临的问题是,对每个路由的第一次调用比以下路由慢。

目前,对 /login 的第一次调用需要 3.6 秒,接下来的调用需要 170 毫秒,所有其他路由都相同。

我发现-XX:+TraceClassLoading在第一次调用时使用它,类被加载到内存中,这导致了性能问题。

但是,我没有找到在启动时加载所有类的简单方法,对于每个新服务,我需要在 ApplicationRunner 中添加一个预热调用。

有没有人有自动加载 SpringBoot 应用程序的类或预热其所有路由的解决方案?

and*_*esp 1

Java的类加载是惰性的。这意味着 JVM 仅在需要时才加载类。

如果你想强制它急切地加载类,你只需要引用它们。一种方法是迭代 jar 内容或类文件以获取类名,然后使用它们来调用Class.forName(className).

此外,如果启动时间和性能对您的用例非常重要,您可能需要研究提前编译解决方案(例如GraalVM),或降低 JIT 的编译阈值 ( -XX:CompileThreshold)。