原因分析(java):CPU内存占用过高 || 程序长时间运行也没有结果

基础知识准备

查看CPU信息

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

在这里插入图片描述

top指令

在这里插入图片描述

  • 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的状况
在这里插入图片描述
(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

在这里插入图片描述

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进制表示的
在这里插入图片描述

实际运用

CPU占用过高的分析步骤

(1)利用top命令找到内存占用过高的进程id,可以通过按y键高亮显示正再运行的进程
在这里插入图片描述
(2)打印出指定进程的线程情况

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

在这里插入图片描述
(3)通过JVM自带的jstack工具生成进程快照,执行命令:jstack -l 进程id
在这里插入图片描述
通过jstack生成快照后,将第2步中查看到占用cpu过高的线程id,转换为16进制【可以通过Windows自带的程序员计算器】,然后到jstack快照中找到对应线程id的日志信息。
在这里插入图片描述

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

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

死锁信息(快照信息最后部分)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/user2025/article/details/109011690
今日推荐