编辑
2023-12-04
JVM
00
请注意,本文编写于 523 天前,最后修改于 523 天前,其中某些信息可能已经过时。

目录

一、JVM架构基础
二、JVM预热是指什么?
三、Tiered Compilation
四、自定义实现
五、工具

JVM的预热是指在应用启动之初,为了保障第一次请求的快速响应,采取特定的策略来处理第一次的预加载逻辑。这是因为JVM的懒加载和JIT(即时编译)机制会导致第一次调用的耗时较长。

一、JVM架构基础

JVM进程启动时,ClassLoader会将需要的所有类加载到内存。ClassLoader主要分为以下三步:

  • Bootstrap Class:负责加载核心类库,例如基础的运行时类库。
  • Extension Class:负责加载java.ext.dirs路径下的类,通常用于添加额外的类库。
  • Application Class:负责加载实际应用包含的类。

二、JVM预热是指什么?

JVM预热是指在类加载过程完成后,所有需要的类会进入JVM cache(native code),以便能够被快速实时访问。然而,并非所有与JVM启动无关的类都会被加载。当第一个请求到达时,会触发相关类的第一次加载,这个过程会耗费一定的时间,影响第一次调用的实时响应。这主要是因为JVM的懒加载和JIT机制。因此,为了保证第一次请求的快速响应,对于低延迟应用,需要采用特定的策略来处理第一次的预加载逻辑,这个过程就是JVM的预热。

三、Tiered Compilation

JVM的即时编译机制会将使用频率较高的方法或代码块编译优化并放入本地缓存,以提高程序的响应速度。为了触发JVM的编译,可以在应用启动时强制加载预先认知的高频方法。相关的设置参数包括:

  • -XX:+TieredCompilation:开启分层编译(1.7 Server模式默认开启)
  • -XX
    :设置触发即时编译的阈值
  • -XX:+PrintCompilation:打印被编译成本地代码的方法名称

通常,虚拟机会通过解释器来收集反馈到编译器的方法调用信息。

四、自定义实现

除了Tiered Compilation,还可以通过自定义实现特定逻辑来进行特定方法的多次调用,以触发JVM的编译。例如,可以定义一个包含基础方法的类,然后创建一个加载类,在其内部添加静态方法,循环多次重复生成对象并调用方法。通过这种方式,可以测试预热之后的性能是否好于未预热状态下的调用。

五、工具

为了进行基准测试,可以使用JMH(Java Microbenchmark Harness)工具。该工具可以帮助进行性能测试和微基准测试。使用JMH,可以定义预热处理方法,并在方法内部添加需要预热的业务逻辑。


Learn more:

  1. 不可不知的 JVM 预热 - WindWant - 博客园
  2. 不可不知的 JVM 预热-腾讯云开发者社区-腾讯云
  3. jvm预热-掘金

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!