当前位置 : 主页 > 编程语言 > java >

java进程占用CPU高的问题

来源:互联网 收集:自由互联 发布时间:2022-07-05
一. 上节回顾 怎么查看CPU使用率? top:显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况。默认每隔3s刷新一次 ps:只显示每个进程的资源使用情况 top并没有细分进程

一. 上节回顾

怎么查看CPU使用率?

top:显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况。默认每隔3s刷新一次

ps:只显示每个进程的资源使用情况

 

top并没有细分进程的用户态CPU和内核态CPU

pidstat:可以分析每个进程的CPU使用情况

 

通过top,ps,pidstat这些工具,能够很快找到CPU使用率较高的进程。要知道CPU到底是哪个函数导致的问题,需要其它的工具,比如:perf top

perf top:类似于top,它能够实时显示占用CPU时间最多的函数或命令,因此可以用来查找热点函数

二. java进程占用CPU高

1. 准备工作

前提条件:

(1) 安装并配置好jdk环境变量(安装位置:/usr/local),安装教程:CentOS7安装JDK1.8图文教程

(2) 安装tomcat(安装位置:/data),注意和jdk版本的对应关系(tomcat 9-->jdk 8)

安装完成后,需要在Centos7上关闭防火墙

#查看防火墙状态
firewall-cmd --state
#关闭防火墙
systemctl stop firewalld.service

(3) 把pertest.war放到/data/apache-tomcat-9.0.19/webapps下,启动tomcat,看能不能访问http://192.168.0.109:8080/pertest/init1.jsp

java进程占用CPU高的问题_16进制

(4) 使用Jmeter制造阶梯型场景,并发20个线程数,持续运行20分钟,需要产生一个比较大的压力,看服务器的资源使用情况

java进程占用CPU高的问题_16进制_02

java进程占用CPU高的问题_tomcat_03

(5) 根据top命令,发现pid:1480的进程占用CPU高达90%以上。输入top按1

java进程占用CPU高的问题_centos_04

(6) 通过命令:ps aux | grep 1480,进一步确定是tomcat的进程导致的

java进程占用CPU高的问题_centos_05

(7) 怎么定位到是哪个线程或者代码导致的?

这个时候就需要显示线程列表:ps -mp 1480-o THREAD,tid,time

找到耗时最高的线程,可以看到1482这个线程,占用时间变化较大

java进程占用CPU高的问题_16进制_06

java进程占用CPU高的问题_tomcat_07

比如:1482这个线程,占用CPU盖度82%,它还在不断的升高

(8) 把这个线程的id转为16进制格式:printf "%x\n" 1482

java进程占用CPU高的问题_tomcat_08

(9) 打印线程的堆栈信息:jstack 1480 | grep 5ca -A60 

java进程占用CPU高的问题_centos_09

(10) 在日志里查看:grep 'OutOf' catalina.out,可以看到内存溢出了

java进程占用CPU高的问题_centos_10

日志里也可以看到一些BLOCKED,WAITING等

java进程占用CPU高的问题_16进制_11

java进程占用CPU高的问题_16进制_12

 


上一篇:Ansible配置执行远程主机的ssh端口号
下一篇:没有了
网友评论