java进程占用CPU高的问题

一. 上节回顾

怎么查看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

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

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

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

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

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

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

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

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/my_captain/p/12674247.html