首页 > 系统相关 >【Linux】linux | top | java | jvm | 分析cpu占用过高 | 分析jvm堆栈信息

【Linux】linux | top | java | jvm | 分析cpu占用过高 | 分析jvm堆栈信息

时间:2022-11-25 11:07:05浏览次数:70  
标签:java tomcat top 30 pid 线程 jvm jmap cpu


一、说明

        1、正式环境,cpu飙升,需要排查想原因

        2、正式环境: CentOS8 + jdk8 + nginx + java服务

二、过程

1、查看cpu占用

1)命令

top c

说明1: 从高到低,显示cpu占用,并标识应用

~~

2、查看pid的子线程

1)命令

top -Hp ${pid}

说明: 查询的子线程,即tid,线程ID

~~

 3、将tid转为16进制

1)命令

printf "%x \n" ${tid}

说明: 后续命令要用到

4、打印堆栈信息

1)命令
jstack ${pid} | grep ${16进制tip} -A 30
说明1: pid是程序id;tid是线程id(16进制的)
说明2: -A 30,即打印30行;也可以改成300
说明3: jstack如果找不到的话,使用绝对路径,在$JAVA_HOME/bin
说明4: 可以打印处理
echo $JAVA_HOME
示例:
/opt/jdk/jdk1.8.0_231/bin/jstack 584867 | grep 8ed00 -A 30
说明5:一般把结果导入到文件,然后下载到windows环境查看
/opt/jdk/jdk1.8.0_231/bin/jstack 584867 | grep 8ed00 -A 30 > jstack.log
说明6: 下载并查看排查就不赘述了
~~

5、备份其他命令

1)jmap -heap ${pid}:输出堆内存设置和使用情况(JDK11使用jhsdb jmap --heap --pid pid)
jmap -heap
2)jinfo -flags ${pid}:查看运行时进程参数与JVM参数
/opt/jdk/jdk1.8.0_231/bin/jinfo -flags
3)jmap -histo ${pid}:输出heap的直方图,包括类名,对象数量,对象占用大小
jmap -histo
说明: 建议用绝对路径,当系统装了多个jdk版本的话,可能提示版本不一致的问题
4)查看系统支持的最大线程数
cat /proc/sys/kernel/threads-max
5)jvm系统监控软件
jvisualvm


下载链接

​https://visualvm.github.io/index.html​

~~

6、cpu飙升原因分析

1)事情的经过

a> 项目是老项目(springboot),是war包,用的tomcat独立容器,版本是: apache-tomcat-8.5.64;什么问题呢,分析得出结论是连接没有释放,tomcat连接线程处于WAITING状态(假死),导致cpu居高不下,重启后恢复
b> 改了项目配置,用springboot内嵌tomcat,版本是: 9.0.39,然后还是发现cpu居高不下,找了好多blog,有个文章说是资源泄露了、建议用线程池,就往这个方向靠;然后全局搜了tomcat配置,确定下是否用了线程池;然后发现,没有用到;然后yml增加上配置
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数,默认为100
accept-count: 5000
threads:
# tomcat最大线程数,默认为200
max: 5000
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
重启后,cpu降下来了,低于40%(姑且认定为配置有效)
c> 但是,监控了一段时间,发现cpu还会飙到40%;执行了上面的堆栈信息,WAITING已经没有了,

改成了这个:

【Linux】linux | top | java | jvm | 分析cpu占用过高 | 分析jvm堆栈信息_tomcat

 没有看错,是业务代码,业务代码导致cpu飙升,可以断定是这块业务有计算量。

d> 看了业务代码,这块用到一个算法;然后加了些日志,打印下耗时时间。结果发现,的确是算法涉及到计算(计算参数越多、越耗时,目前发现一次计算最大耗时2分钟)。算法计算这块,不属于服务异常了,但是依然是个潜在的风险点,还需要想办法规避掉;要么改算法,要么扩容cpu(4核的,的确不够看),要么用其他方案。

e>  大致上是这么个情况。

~~

标签:java,tomcat,top,30,pid,线程,jvm,jmap,cpu
From: https://blog.51cto.com/u_15891242/5885723

相关文章

  • iTOP3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心主板
    主要参数    处理器:龙芯3A5000主频:2.3GHz-2.5GHz桥片:7A2000内存:8GB、16GBDDR4带ECC纠错(配置可选)系统:Loongnix典型功耗:35W核心板:16层底板:4层核心板......
  • 【Java】java | swagger用法
    一、说明        1、备份下swagger用法二、注解使用1、用于Controller1)注解@Api(tags="登录")说明:归类,即一级菜单示例:~~2、用于请求1)注解@ApiOperation("账号密......
  • 【Java】java | springboot | 全局异常处理 | 拦截404
    一、说明        1、maven项目        2、springboot项目        3、走统一异常处理二、代码1、拦截4041)直接copy@ExceptionHandler(NoHandlerFoun......
  • 【Java】 java | linux | tomcat线程池配置 | tomcat性能调优
    一、说明        1、tomcat,一般用于传统的java项目,比如war包        2、tomcat,一般用的时候就是下载、解压、上传war包、启动tomcat        3、tom......
  • 【Java】java | minio | 安装minio
    一、说明        1、minio对象存储,玩一下二、Windows环境1、下载1、下载列表​​https://dl.min.io/server/minio/​​2、我用的版本​​https://dl.min.io/server/......
  • 【Java】 java | nacos | nacos使用注意事项
    一、说明        1、本文档总结nacos使用心得及日常遇到的问题        2、不涉及技术配置二、关于本地调试1、场景1:本地调试多个模块1)建议使用本地nacos2)......
  • Java学习
    分享学习一个技术的经验,Java的大体路线是JavaSE->JavaWeb->Spring->SSM整合(Spring+SpringMVC+myBatis)->SpringBoot->SpringCloud.要想到达最终的Springboo......
  • JAVA收录影记
    Controller层代码就该这么写,简洁又优雅描述了定义项目控制器时正确的打开方式,便于统一对请求参数、响应参数、异常做统一的处理,让控制器更多关注参数的接收和响应的返回......
  • iTOP3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心主板
       主要参数    处理器:龙芯3A5000主频:2.3GHz-2.5GHz桥片:7A2000内存:8GB、16GBDDR4带ECC纠错(配置可选)系统:Loongnix典型功耗:35W核心板:1......
  • Java并发编程学习13-任务取消(下)
    任务取消(下)《任务取消》由于篇幅较多,拆分了两篇来介绍各种实现取消和中断的机制,以及如何编写任务和服务,使它们能对取消请求做出响应。1.任务限时运行我们知道许多任务......