EN
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

使能JBolt特性

介绍

主流JIT编译简单按照编译时机将方法代码追加到代码缓存区中,在热方法多且分布散乱时icache/iTLB miss就会引起较高的CPU惩罚,造成前端系统瓶颈。JBolt特性利用采样手段获取运行时JIT方法的热点和调用链关系,再通过算法重排将热方法代码以较优方式集中,提高空间局部性,降低icache/iTLB miss率以提升程序性能。

场景建议

由JIT CodeCache引起的icache/iTLB miss率高(可使用性能分析工具跟踪CPU缓存命中率如Linux perf命令等),应用程序热方法多且分布散乱。

使用约束

  • JBolt特性仅支持毕昇JDK 17版本,从毕昇JDK 17.0.14子版本后开始支持。
  • 应用支持使用 JFR。一般应用不做特殊设置如 -XX:-FlightRecorder 强制关闭都是默认支持 JFR 的。
  • 应用需要使能 C2 编译器。在 -Xint 及诸如 AppCDS dump 等不使能编译器的场景下无法使用 JBolt。
  • 应用需要支持 Segmented CodeCache。JBolt 依赖 Java9 之后的代码缓存分区特性,也是默认使能的,如果应用含 -XX:-TierdCompilation、-XX:-SegmentedCodeCache 以及 -XX:ReservedCodeCacheSize < 240M 等会关闭这一特性,则无法使用 JBolt。

(推荐)使用方法一:“一步式”模式

“一步式”模式:一次运行过程中自动完成采样及重排,可支持进行多次采样重排过程。

  1. 使能JBolt,启动后自动执行一次采样重排。强烈建议添加“-Xlog:jbolt=info”参数,该参数会在JBolt各个重要环节输出信息给控制台,采样完成后自动进行重排,重排完成后加了 -Xlog 信息会看到 “JBolt reordering succeeds.”,代表 JBolt 生效。此参数对“两步式”模式同样适用。命令行中spring-petclinic.jar是业务程序包举例,请结合具体使用程序进行替换。
    $JAVA_HOME/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseJBolt -Xlog:jbolt=info -jar spring-petclinic.jar

    “一步式”模式,支持如下两个参数组合使用:

    • -XX:JBoltSampleInterval:采样持续时间(秒)。无特殊情况默认不设置,默认值600秒,即采样时间持续600秒。
    • -XX:JBoltCodeHeapSize:JBolt堆大小。默认值8M,此默认值在一些编译方法较多的场景(原本使用的CodeCache偏大)可能不够用,需要结合场景设置,设置的大小需与page-size对齐,可参考值为原本实际使用的Non-profiled段大小的1/4~1/2(使用大小可用-XX:+PrintCodeCache参数查看,例:non-profiled used=16M,JBoltCodeHeapSize建议设为4M~8M之间)。
  2. 在“一步式”模式下,用户可以使用jcmd命令控制采样时机,在线启动JBolt热点重排。

    当前支持以下4个命令,使用方式参考:jcmd <pid> JBolt.xxx

    <pid>为1开启的Java进程ID,结合具体业务进程在命令中替换。

    • JBolt.start:开启一次自动采样并在持续时间结束后应用重排。可选duration参数,与-XX:JBoltSampleInterval意义相同,默认值即为JBoltSampleInterval的值。使用方式:
      $JAVA_HOME/bin/jcmd <pid> JBolt.start [duration=<sample interval>]

      此时正在采样重排中会开启不成功,可等待时间结束或使用stopabort命令提前结束。

    • JBolt.stop:立即停止当前采样并应用重排。使用方式:
      $JAVA_HOME/bin/jcmd <pid> JBolt.stop
    • JBolt.abort:与stop相同但不会应用重排。使用方式:
      $JAVA_HOME/bin/jcmd <pid> JBolt.abort
    • JBolt.dump:将当前应用中的顺序表导出。带一个filename必须参数指定有效文件路径。使用方式:
      $JAVA_HOME/bin/jcmd <pid> JBolt.dump filename=<eg: order.log>

使用方法二:“两步式”模式

“两步式”模式:将采样和重排分为两个阶段分开运行。

  1. 使能DumpMode,进行采样,采样持续到程序退出(需要程序自然退出或手动Ctrl+C,如果是异常退出则不会生成),将顺序表导出到指定文件
    $JAVA_HOME/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseJBolt -XX:+JBoltDumpMode -XX:JBoltOrderFile=<eg: order.log> -Xlog:jbolt=info -jar spring-petclinic.jar
  2. 使用生成的顺序表文件,再次启动程序进行布局重排应用,该步骤需要应用启动一段时间后才可能会进行重排,生效的标志与一步式下相同,生效后可期望取得优化效果
    $JAVA_HOME/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseJBolt -XX:+JBoltLoadMode -XX:JBoltOrderFile=<eg: order.log> -Xlog:jbolt=info -jar spring-petclinic.jar

    “两步式”模式不支持jcmd命令控制采样时机的操作。