文章目录

  • 基础知识准备
  • 查看CPU信息
  • top指令
  • top界面的实用操作
  • 找出线程占用cpu的情况
  • JVM之Jstack使用
  • 实际运用
  • CPU占用过高的分析步骤
  • 程序长时间运行也没有结果


基础知识准备

查看CPU信息

cat /proc/cpuinfo
 cat /proc/cpuinfo|grep 'cpu cores' # cpu的物理核数
 cat /proc/cpuinfo|grep 'processor' # 查看逻辑核标识,一般从0开始

java 查看cup和内容工具 java查看cpu核数_JVM

top指令

java 查看cup和内容工具 java查看cpu核数_java 查看cup和内容工具_02

  • load average: 0.03, 0.06, 0.06 负载均衡值,三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值
  • CPU(s)是系统所有用户进程占用整个CPU的平均值,由于每个核心占用的百分比不同,所以按平均值来算
  • %CPU(s)显示的是进程占用一个逻辑核的百分比,而不是整个cpu(8核)的百分比,有时候可能大于100,那是因为该进程启用了多线程占用了多个核心,所以有时候我们看该值得时候会超过100%,但不会超过总核数*100%
  • %MEM 进程使用的物理内存百分比

top界面的实用操作

进入top界面时,默认各进程是按照逻辑CPU的占用量来排序

(1)在top基本视图中,按键盘数字“1”可以监控每个逻辑CPU的状况

java 查看cup和内容工具 java查看cpu核数_JVM_03


(2)敲击键盘‘y’来打开或者关闭运y行态进程的加亮效果</font>

(3)按u后输入用户名,则监控指定用户

(4)按k后输入用户进程PID,则结束指定进程

(5)按q退出top界面

找出线程占用cpu的情况

列出了进程id, 线程id、cpu占有率和执行的指令,同时按照cpu占有率排序。
pid: processor id 进程id
tid: thread id 线程id

ps H -eo user,pid,ppid,tid,%cpu,cmd --sort=%cpu

java 查看cup和内容工具 java查看cpu核数_死锁_04

JVM之Jstack使用

jstack是jdk自带的线程堆栈分析工具,主要用于生成java虚拟机当前时刻的线程快照,定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等

jstack 进程id(pid)  # 控制台输出指定进程的信息
jstack  进程id >文件     #打印堆栈信息到文件中 
jstack -l  进程id    #除堆栈外,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

注意:

(1) jstack只能分析JVM虚拟机开启的进程

(2) jstack生成快照中,tid 是java中为这个线程的id,nid 是这个线程对应的操作系统本地线程id,每一个java线程都有一个对应的操作系统线程,且它们都是通过16进制表示的

java 查看cup和内容工具 java查看cpu核数_java 查看cup和内容工具_05

实际运用

CPU占用过高的分析步骤

(1)利用top命令找到内存占用过高的进程id,可以通过按y键高亮显示正再运行的进程

java 查看cup和内容工具 java查看cpu核数_死锁_06


(2)打印出指定进程的线程情况

ps H -eo user,pid,ppid,tid,time,%cpu,cmd|grep 进程id

java 查看cup和内容工具 java查看cpu核数_死锁_07


(3)通过JVM自带的jstack工具生成进程快照,执行命令:jstack -l 进程id

java 查看cup和内容工具 java查看cpu核数_堆栈_08


通过jstack生成快照后,将第2步中查看到占用cpu过高的线程id,转换为16进制【可以通过Windows自带的程序员计算器】,然后到jstack快照中找到对应线程id的日志信息。

java 查看cup和内容工具 java查看cpu核数_死锁_09

程序长时间运行也没有结果

程序长时间运行也没有结果可能是死锁了,分析步骤和上面相同

死锁信息(快照信息最后部分)

java 查看cup和内容工具 java查看cpu核数_堆栈_10