java windows cpu问题_Windows平台下tomcat+java的web程序持续占cpu问题调试

本文主要讲述了在Windows平台上,遇到Tomcat进程CPU占用率高的问题。通过Process Explorer观察到特定线程ID高CPU占用,并使用jstack获取Java线程堆栈信息。分析发现,线程在处理Socket时处于阻塞状态,等待客户端数据。最后,通过改用NIO非阻塞方式进行优化,成功解决了CPU资源消耗过大的问题。
摘要由CSDN通过智能技术生成

1、问题

Tomcat服务器跑了一段时间后,发现Tomcat进程占用的CPU资源在80%-100%间,加上其它的进程,整个服务器的CPU处理100%运行状态。

2、通过process explorer查看Tomcat进程下的线程

下载后直接打开就可以了。

04e0d7d236feb90c7225e92617ca2f6c.png

点开tomcat进程:

177cb8ab71d38fc6db20ee6ea88f1edf.png

这时候发现6596、12200两个TID线程占用CPU最高。

下面我们要找到这两个线程在我们程序中的位置。

3、通过jstack把进程下所以的Java线程栈的内容打印出文本中。

如我们的Tomcat进程PID为900。

jstack -l 7388 > c:/java.stack

注:通过tomcat的windows服务启动的tomcat是无法使用此命令获取线程栈的内容(如下图),必须通过startup.bat来启动。

9e3cd1a84e0a53a23a0db5ecad5b08f7.png

4、分析stack文本

打开c:/java.stack文件。

23d2cef6ad0534801a143a3d0b4ee315.png

通过process explorer获取到的线程TID对应的是stack文本线程栈描述内容中的nid的十进制值。

我们把TID为6596转成十六进制为19c4,然后根据19c4在stack文本中找到此线程栈的描述内容为:

cad918a6d4a22d9e8b3fd69c6f05df2b.png

根据描述,我们可以看到,此线程是处理到了SocketThread类的91行处。

6e3ba0a56c88173a87b5eecac6bb0998.png

91行代码是线程下的socket在阻塞状态下等待读取客户端发送过来的数据。

后面几个TID线程也是同样的问题。

5、解决

经分析+谷哥+度娘后,socket服务器每与一个客户连接都产生一条线程来处理事务的做法比较耗资源。

使用用NIO非阻塞的方式重写了socket后,问题得到解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值