JDK Mission Control 7.0.1中Call Tree功能位置及方法CPU占比查询
Hey there! 我之前也折腾过开源版JMC和闭源版的功能差异,刚好能给你捋清楚~
关于开源版JMC 7.0.1的CPU耗时调用树功能
闭源版JMC的「Code」标签功能,在开源版里其实是整合到Flight Recorder(JFR)的分析视图里了——毕竟JFR现在是OpenJDK的核心组件,和JMC深度绑定。具体操作步骤是:
录制Flight Recorder记录
连接到你的Java 11应用后,右键点击应用节点,选择「Start Flight Recording」。在配置界面里,一定要确保开启了方法分析相关的选项:- 轻量排查选「Sample based profiling」(默认可能已勾选):通过定期采样线程栈统计CPU耗时,性能开销极小;
- 需精确方法级统计选「Instrumented profiling」:能追踪每个方法的调用次数、精确耗时,但会有一定性能开销,更适合测试环境使用。
查看调用树
录制完成后打开生成的.jfr文件,在左侧导航面板找到**「Profiling」**标签,展开后就能看到「Call Tree」视图。这里的功能和闭源版基本一致:- 可按CPU耗时从高到低排序,快速定位最消耗CPU的方法;
- 点击节点展开能看到完整调用链,清楚知道上层触发方法;
- 还能切换到「Hot Methods」视图,直接列出Top N高CPU方法,更直观。
其他查看方法CPU使用率的途径
如果暂时不想用JFR,还有两个实用方式:
JMC的Threads标签
打开应用的「Threads」标签,切换到「CPU Usage」视图,能看到每个线程的实时CPU占比。发现高CPU线程后,右键选择「Take Thread Dump」,从栈帧里就能看到该线程当前执行的方法,多次快照对比就能定位持续耗时的代码。命令行工具组合
用系统工具+JDK命令行工具手动排查:- Linux/macOS:先用
top -H找到高CPU的线程ID(注意是线程ID而非进程ID),转成十六进制;再用jstack <进程ID>导出线程栈,搜索十六进制线程ID,对应的栈帧就是当前执行的方法。 - Windows:打开任务管理器找到Java进程,查看线程列表定位高CPU线程,转成十六进制后用
jstack排查。不过这种方式是快照式的,不如JFR的连续采样全面。
- Linux/macOS:先用
内容的提问来源于stack exchange,提问作者Tinus Tate
相关产品推荐
相关产品推荐

