java程序cpu 升高一个可能的原因

最近一个应用出现了cpu升高到100%的问题,一直没有解决掉

根据常见的top  -Hp等思路发现占用cpu较高的几个pid 都是正常业务,

不过当时也看到有属于内存回收的进程占用的cpu非常高,但是很快就没有了, 当时没太注意

 

后来还改了程序的一个实现方式,因为修改了cat的源码,当时以为改坏了,目前看只靠猜测是不靠谱的

修改了实现方式还是不行 还是几天后会cpu100%

处理步骤:

1今天还是利用jstack pid打出了应用的线程栈信息 发现线程数非常多 

tomcat启动了7000左右的线程 

查看某个应用pid下面的线程数

ps -Lf 10090|wc -l     (10090为某个应用的pid)

 

2查看当前tomcat的jvm的配置发现 Xms Xmx都是2g 服务器总共4g

top看到tomcat使用内存已经是2.7g 

使用命令查看gc情况 

java程序cpu 升高一个可能的原因_第1张图片

有点慌  12天运行fullgc 13827次 年老代一直100% fullgc没效果了 内存不够

当然这个使用内存(和占用cpu 和线程数)都是慢慢爬上去的,所以一开始有可能几天看不出来这个问题

(参数的解释可以看这里https://blog.csdn.net/AlbertFly/article/details/87084744 )

 

解决办法 在4g 总内存的情况下 调整jvm 参数

-Xms3460m -Xmx3460m -Xss256K -XX:NewSize=1724m -XX:MaxNewSize=1724m   

  

Xss默认是1m 由于这个项目使用线程数很多 设置为较小值 比较合适,新时代 年老代都调大.

目前测试环境还在观察 效果

-----------

测试一天发现还是有问题 提高内存 减小线程大小从根本上解决不了问题 

因为线程数还在上升,慢慢把内存占满最后发现是cat引入了一个依赖包 有问题,

 

最后cpu100%的问题还是回归 top -Hp  以及查找具体的线程 定位具体的线程栈信息 

如果定位到自己项目的方法 基本就是问题所在

如果是底层的代码,可能是这个底层代码出问题了 看看依赖是否正确

或者拿掉。或者寻找替换品,或者版本是否正确

 


 

 

你可能感兴趣的:(linux,jvm)