Linux下Java程序CPU飙高怎么定位具体到哪一行代码

梦宇君_2671

梦宇君_2671

2026-09-22

539人浏览

原创

能定位到具体代码行,但必须经过“进程→线程→栈帧”三级穿透,漏掉任何一环就卡在方法名,看不到行号。

linux下java程序cpu飙高怎么定位具体到哪一行代码

能定位到具体代码行,但必须经过“进程→线程→栈帧”三级穿透,漏掉任何一环就卡在方法名,看不到行号。

top -Hp 找不到高 CPU 线程?检查是否开了线程显示模式

很多同学执行 top -Hp <pid></pid> 后看到的全是 0% CPU,根本找不到热点线程。这不是命令错了,而是 top 默认不实时刷新线程视图——它需要你先按 H 键(大写)切换到线程模式,再按 P 按 CPU 排序。直接输 top -Hp <pid></pid> 只是启动时进入线程视图,后续仍需手动按 P 才生效。

  • 确认终端支持 ANSI 控制符(某些跳板机或老旧 SSH 客户端会禁用)
  • 如果 top -Hp <pid></pid> 输出为空,试试 ps -mp <pid> -o tid,%cpu,time | sort -k2 -nr | head -10</pid> 替代
  • %CPU 列显示的是该线程在采样周期内占用单个逻辑核的百分比,100% 表示占满一个核;Java 进程总 CPU 是所有线程之和,所以 4 核机器上 Java 进程 CPU 达 380% 是完全可能的

jstack 日志里搜不到 0x 开头的线程 ID?注意大小写和前缀

jstack 输出中线程 ID 格式固定为 0x,比如 0x4d2。但你用 printf "%x\n" 1234 得到的是 4d2(无前缀、小写),直接 grep "4d2" 会失败——因为日志里是 0x4d2,且可能混在 tid=0x4d2java.lang.Thread.State: RUNNABLE 上方几行。

onewo-rtlinux
onewo-rtlinux

Linux 实时编程助手。生成、审查并修改用于周期性控制任务和中断驱动程序的 C 代码。强制实施实时调度策略。

下载
  • 务必加 0x 前缀搜索:grep -A 20 "0x4d2" jstack.log
  • 别用 grep -i:虽然 0X4D2 理论上存在,但 JVM 实际输出永远是小写 0x
  • 如果匹配结果为空,检查 jstack.log 是否完整:有些容器环境因权限限制,jstack 可能只输出部分线程(提示 Unable to get thread dump),此时换 kill -3 <pid></pid> 触发堆栈到 stdout 或日志文件更可靠

找到线程栈却看不到 Java 行号?确认 class 文件带调试信息

即使成功定位到某线程的 RUNNABLE 栈帧,也可能只看到 com.example.service.Task.run(),没有 Task.java:88 这样的行号。这不是排查流程问题,而是编译产物缺失调试符号。

  • 生产 JAR 包若用 maven-compiler-plugin 默认配置构建,且未显式开启 debug,JVM 就无法映射字节码到源码行
  • 验证方式:解压 JAR,用 javap -l <class></class> 查看是否有 LineNumberTable 属性
  • 补救办法有限:重启应用时加 JVM 参数 -XX:+UseSplitVerifier(仅旧版 JDK)无效;真正可行的是重建带 -g 的包,或用 arthasjad 命令反编译(依赖运行时类加载器,不一定能还原原始行号)

Arthas 的 thread -n 3 为什么有时不准?它统计的是采样窗口内的平均值

arthasthread -n 3 看起来最省事,但它底层调用的是 JVM TI 的 GetThreadCpuTime,返回的是自线程启动以来的累计 CPU 时间,再除以采样间隔算出“平均占用率”。这意味着:

  • 刚启动的短生命周期线程(如定时任务触发的 Runnable)可能因时间太短被忽略
  • 如果高 CPU 是脉冲式的(比如每分钟打一次 Full GC + 大量对象分配),而 thread 命令采样间隔是 10 秒,就很可能错过峰值
  • 它不等价于 top -Hp 的实时调度器视角,两者数值常有 10%–30% 差异

真要抓瞬时热点,得用 async-profiler 生成火焰图:./profiler.sh -e cpu -d 30 -f /tmp/flame.html <pid></pid>,它基于 perf_events,采样精度到微秒级,且能下钻到 native 方法和 JIT 编译后的汇编行。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

8777

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

5982

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5372

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

964

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

808

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1156

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2329

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19671

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1055

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

Linux系统运维及项目正式上线
Linux系统运维及项目正式上线

共14课时 | 2.8万人学习

Linux负载均衡视频教程
Linux负载均衡视频教程

共7课时 | 1.9万人学习