鲲鹏社区首页
中文
注册
开发者
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

使能JProfilecache特性

介绍

Java应用启动阶段存在热点方法即时编译与业务请求处理对CPU资源的竞争问题,可能因为编译延迟导致系统性能爬坡缓慢。JProfilecache特性基于收集上一次运行的Profiling信息再次启动时先触发热点方法编译使用户Java进程快速抵达峰值性能。

场景建议

CPU资源受限、编译线程CPU占比高,进程启动后无法快速抵达峰值性能。

使用约束

  • 当毕昇JDK版本为8时支持JProfilecache特性,从毕昇JDK 8u452开始支持。
  • 服务部署的Java版本要升级到和支持该功能的JDK工具包对应的版本。
  • 请参见安装毕昇JDK加速库完成毕昇JDK加速软件包的下载和安装。
  • JProfilecache特性目前为实验特性,使能JProfilecache特性需要在特性参数前面设置 -XX:+UnlockExperimentalVMOptions。
  • JProfilecache特性记录热点信息功能不支持类卸载需要设置-XX:-ClassUnloading,并且如果使用CMS则需要设置-XX:-CMSClassUnloadingEnabled关闭GC时的类卸载,如果使用G1则需要设置-XX:-ClassUnloadingWithConcurrentMark关闭GC时的类卸载。
  • JProfilecache特性的记录热点信息和使能JProfilecache加载编译信息功能目前不支持类数据共享,且需要通过参数-XX:-UseSharedSpaces禁用UseSharedSpaces,其他UseSharedSpaces相关参数如:-Xshare:on(会开启UseSharedSpaces)也不可同时使用。
  • JProfilecache特性记录热点信息和使能JProfilecache加载编译信息功能目前不支持纯解释执行。
  • JProfilecache特性记录热点信息功能需要启用解释器的性能分析功能需要设置为开启-XX:+ProfileInterpreter。
  • JProfilecache特性使能和JProfilecache加载编译信息功能目前不支持分层编译,需要设置启动参数-XX:-TieredCompilation,分层编译默认打开。

使用方法

下面以spring-petclinic-2.7.3.jar程序为例简单说明JProfilecache的用法。

  1. 生成编译信息文件。
    1
    java -XX:-ClassUnloading -XX:-CMSClassUnloadingEnabled -XX:-ClassUnloadingWithConcurrentMark -XX:+UnlockExperimentalVMOptions -XX:ProfilingCacheFile=jprofilecache.log  -XX:+JProfilingCacheRecording  -XX:JProfilingCacheRecordTime=30 -jar spring-petclinic-2.7.3.jar
    
  2. 使能JProfilecache加载编译信息。
    1
    java -XX:+UnlockExperimentalVMOptions -XX:+JProfilingCacheCompileAdvance -XX:-TieredCompilation -XX:ProfilingCacheFile=jprofilecache.log -XX:JProfilingCacheDeoptTime=0 -jar spring-petclinic-2.7.3.jar
    
  3. 触发编译。
    1. 找到进程pid执行jcmd命令触发JProfilecache编译。
      jcmd <pid> JProfilecache -notify

      执行成功时会返回“Command executed successfully”,执行失败会返回失败原因。

    2. 查看编译是否已经完成,如果编译完成即可执行正常业务。
      jcmd <pid> JProfilecache -check

      如果编译完成会返回“Last compilation task has compile finished”,执行失败会返回失败原因。

      • 使能JProfilecache特性触发预编译后,Java进程的峰值性能可能会存在一定的劣化,当JProfilecache编译的方法会被梯次退优化重编后,此时峰值性能会明显改善。
      • 使能JProfilecache特性触发预编译后,如果设置一段时间后开始退优化JProfilecache编译的方法,理论上在方法退优化重新触发方法编译时,性能可能会有微波动,具体以业务实测为准。

以上命令参数说明如表1所示。

表1 JProfilecache特性使能命令参数说明

参数

说明

-XX:JProfilingCacheRecording

是否开启JProfilecache特性的记录热点信息功能。

-XX:JProfilingCacheRecordTime

记录编译信息的时间(单位为秒),默认情况下为0。

-XX:ProfilingCacheFile

记录的编译信息生成到的文件路径。

-XX:JProfilingCacheCompileAdvance

是否开启JProfilecache特性的编译功能。

-XX:JProfilingCacheDeoptTime

JProfilecache会在指定时间使用退优化编译的方法。

设置JProfilingCacheDeoptTime为0可以取消定时,默认为1200(单位为秒)。如果看到日志“all profilecache methods have been deoptimized”表示JProfilecache触发编译的方法已经全部退优化。