JEP509:该特性是一个实验特性,增强了JFR以便获取更准确的CPU时间信息,目前仅在Linux平台可用。
在这之前,JFR使用的是墙钟时间,无法捕获原生代码如Native 代码的CPU消耗**;**线程阻塞在I/O时,时间仍然在走,并且无法区分线程是真正消耗CPU还是处于等待状态。
JEP 509 引入新的 JFR 事件 jdk.CPUTimeSample,基于线程实际消耗的 CPU 时间。
java
public class CPUProfiling {
void main() {
IO.println("开始执行计算任务...");
for (long i = 0; i < 2_000_000_000L; i++) {
Math.sqrt(Math.log(i + 1));
}
IO.println("完成");
}
}
编译:
java
javac --enable-preview --release 25 CPUProfiling.java
运行并记录CPU时间:
java
java '-XX:StartFlightRecording=jdk.CPUTimeSample#enabled=true,jdk.CPUTimeSample#throttle=500/s,filename=cpu.jfr' CPUProfiling
执行结果:(非Linux平台,告警CPU time method sampling not supported)

生成jfr文件:

分析结果:
java
/jdk/jdk-25.0.2.jdk/Contents/Home/bin/jfr view cpu-time-hot-methods cpu.jfr

java
/jdk/jdk-25.0.2.jdk/Contents/Home/bin/jfr summary cpu.jfr

在Linux上执行:
