Windows平台下tomcat+java的web程序持续占cpu问题调试(转)

1 篇文章 0 订阅

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

2、通过process explorer查看Tomcat进程下的线程
process explorer下载:https://technet.microsoft.com/en-us/sysinternals/bb896653/ 
我使用的是汉化后的版本(需要1积分):https://download.csdn.net/download/dashumak/10611418

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

è¿éåå¾çæè¿°

点开tomcat进程:

 è¿éåå¾çæè¿°
这时候发现6596、12200两个TID线程占用CPU最高。 
下面我们要找到这两个线程在我们程序中的位置。

3、通过jstack把进程下所以的Java线程栈的内容打印出文本中。
如我们的Tomcat进程PID为900。

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

è¿éåå¾çæè¿°

4、分析stack文本
打开c:/java.stack文件。 

è¿éåå¾çæè¿°
通过process explorer获取到的线程TID对应的是stack文本线程栈描述内容中的nid的十进制值。

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

è¿éåå¾çæè¿°

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

è¿éåå¾çæè¿°

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

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

5、解决
经分析+谷哥+度娘后,socket服务器每与一个客户连接都产生一条线程来处理事务的做法比较耗资源。 
使用用NIO非阻塞的方式重写了socket后,问题得到解决。
--------------------- 
作者:ibenben.org 
来源:CSDN 
原文:https://blog.csdn.net/jrainbow/article/details/49026365 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值