java应用程序cpu持续升高问题。

问题描述

唠叨几句:本次案例解决方案在最后,不感兴趣的朋友,可以直接看最后。

此问题困扰了半年多,当然因为只是接手过来的项目,只负责运维和优化,有自己的另外一个项目在开发,所以中间都是断断续续的分析问题,偶尔手里不太忙的时候,就会分析一下这边情况。一说CPU持续升高,或者服务器挂掉,运维都会提醒是不是有死循环,如果真的是内存升高,在网上随便找两个例子,应该就能解决了。最终还要感谢我以前的同事,我们两个一起分析,讨论,终于将这场战役打赢了。

java的一个仓库项目

使用的框架:springMvc,阿里的MQ(ons),dubbo,zk。,ons-client-1.2.4

问题现象:项目能够正常启动,但是第二天cpu就已经升到20%多,在后面的每一天,都会升级,如图。

6ba6a313d83fc48189751ea75831b757412.jpg

d8094410c86121c898710225f9479f8ce48.jpg

 ---------------------------------------

第一步 查看进程

使用命令,top, ps -ef|grep java 这两个都行

第二步 生成dump文件

使用命令 jmap -dump:format=b,file=Hump0702b.bin 74056

第三步 运行 MemoryAnalyer工具,导入生成bin文件

第四步 分析

分析过内存溢出的朋友,应该对上面的命令不陌生,所以命令含义就不解释了。

还有一个在线的工具,用 jstack 870245 >aa.txt 命令转存出来文件,然后用在线工具 http://fastthread.io/

这个还是不错的,

从怀疑代码写的有问题(因为是接手的项目,所以代码不熟悉),到最后分析是连接没释放。

连接没释放,怀疑是定时任务,但是分析代码之后,并不是此问题。

通过在线工具,和 jstack 870245 指向的都是阿里的MQ没有释放,如我第一张图那样,好多都是那样的内容。

925c73ef0f5796e07117a24850c9e09dbee.jpg

虽然定位连接没释放,仍然怀疑是代码原因,可能没关闭连接。

经过找阿里的MQ例子,和别的项目使用的,都一模一样。

在此期间,将jvm的调优的一些参数都加上了,MQ的消费也加上线程了。

5a0653ce473b2e3defdf607ee7d5dd29fdd.jpg

都没有达到cpu不升高的理想。

最后我们两个人在周日的时候,一起蹲在公寓里面,一边上网搜资料,一边分析。

发现阿里的MQ(ons)一个包的源码有可能有问题。

7d792bf23204456917fe4d39885694f76fd.jpg

报错指向此处,所以看了看源码,AsyncTraceDispatcher,我当时使用的是1.2.4版本的ons-client包,源码我就不上了。感兴趣的可以看看。

最后我们在网上搜此包的maven,发现如图

8d0492351554201c24da4f7b03f969b061c.jpg

发现1.2.4的没有人用,或者说用的人少。我当时看另外一个项目使用MQ非常正常,那个项目用的是1.1.8

所以我下载了1.1.8的包,发现压根就没有AsyncTraceDispatcher这个类,我们还分析了1.2.7.Final的包,这个是有AsyncTraceDispatcher这个类的,但是源码跟1.2.4的不一样,因为水平有限,所以源码看的是似懂非懂。

最终决定用1.1.8的包试一下。经过两天观察,cpu没有继续升高,一直维持平稳的状态。

 

总结:个人认为,

ons-client-1.2.4的包是有问题,
将包换成
ons-client-1.1.8的包,就解决了cpu升高的问题。当然1.2.7.Final我没有试,但是看图上使用的人非常多,所以应该也能解决我的问题。

最后上两张图,我的cpu快爆的,和已经稳定

a6b8bdce22dabb5ec2974bac4381281b765.jpg

8928a5240244e1b5a510f1cafa2505b9698.jpg

 

个人水平有限,说出来的难免有错误的,最终目标是解决cpu稳定,不当之处,欢迎指出。

再次感谢我的小伙伴。安排

转载于:https://my.oschina.net/u/1772272/blog/1858890

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值