theme: geek-black
这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战
在生产环境中,有时会遇到一些CPU占用过高,一直下不去的场景。出现这种情况,可能会导致服务对外中断,服务器超负荷运行影响硬件寿命。这篇文章从实践出发,一步一步地分析如何使用
top
和jstack
命令快速定位问题代码位置。
一、top命令
top (table of processes) is a task manager program, found in many Unix-like operating systems, that displays information about CPU and memory utilization.
维基百科解释到,top (进程表)是一个任务管理器程序,可以在许多类 unix
操作系统中找到,它显示有关 CPU 和内存使用情况的信息。
同时,top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用、内存使用和执行时间对任务进行排序。
上图是一个Centos 7
系统,执行top命令后瞬时的展示信息。
- 第一行描述系统的信息,包括开机时间、用户登录、CPU整体负载
- 第二行描述任务总体执行情况,即各类进程占比情况
- 第三行描述CPU总体信息,比如空闲占比等
- 第四行描述物理内存占比情况
- 第五行描述交换区占比情况
- 动态的列表描述的详细进程各项信息,比如PID 进程ID, %CPU 进程占用CPU的使用率,TIME+ 该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。 > 一般linux系统会自带top命令,还有另外一个命令行工具
htop
,有时需要自行安装,它与传统的 top 命令功能一样,但它有更加强大的功能及能显示更多的信息。
二、 jstack命令
jstack prints Java stack traces of Java threads for a given Java process or core file or a remote debug server。
oracle官网解释到,Jstack 打印给定 Java 进程或核心文件或远程调试服务器的 Java 线程的 Java 堆栈跟踪。
对于每个 Java 框架,使用jstack指令将打印完整的类名、方法名、“ bci”(字节码索引)和行号(如果可用)。使用-m 选项,jstack 将打印所有线程的 Java 和本机帧以及“ pc”(程序计数器)。
用法很简单,如下图。
一般说,我们会先使用jps
命令显示当前所有java进程pid的命令。
$jps
然后再执行对执行进程ID 执行 jstack。
$ jstack 15673
如果明确自己的Java进程ID,当然直接使用 jstack指令即可。
下一篇实战【JVM调优 】 快速定位服务CPU过高(实战)| 8月更文挑战