---
title: 使能JProfileCache特性
description: "Java应用启动阶段存在热点方法即时编译与业务请求处理对CPU资源的竞争问题，可能因为编译延迟导致系统性能爬坡缓慢。JProfileCache特性基于收集上一次运行的Profiling信息再次启动时先触发热点方法编译使用户Java进程快速抵达峰值性能。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengaccel/system-lib/ugbishengjdklib/kunpengaccel_jdk_06_0007.html
sourcePath: /source/zh/kunpengaccel/system-lib/ugbishengjdklib/kunpengaccel_jdk_06_0007.html
indexId: 57a1fbf6febc724ac50ab8007819ff197135ef025568145c2618a4dedae3a80780
---
# 使能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. 触发编译。

  a. 找到进程pid执行jcmd命令触发JProfileCache编译。

```
jcmd
<pid>
JProfilecache -notify
```


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

  b. 查看编译是否已经完成，如果编译完成即可执行正常业务。

```
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触发编译的方法已经全部退优化。 |
