关于Java CPU占用过高的问题解决总结

以前做压测的时候,遇到过CPU过高的情况,但是没有总结,今天又遇到这种情况,导致到处找资料,虽然知道思路,但是很多命令都要重新找度娘或谷歌。所以这次总结下:

现象:项目突然宕机,连到服务器上发现CPU 接近800%(8核)。

步骤1:首先top命令查看CPU占用最高的进程,发现是java进程(32691)。

步骤2:在top界面按下“H”(centOS,ubuntu)查询最高的线程信息(32693),一般为多个。

步骤3:“kill -3 32691(tomcat进程号)”,这时会将此时刻线程的堆栈信息输出到catalina.out文件中。

步骤4:将32693转换为16进制7fb5,在catalina.out中搜索该进程,查看堆栈信息

步骤5:这里一般可以看到几种情况 1.死锁 2.死循环或大量循环 3.gc(垃圾回收)

步骤6:如果是gc,则可以使用jstat -gcutil 326911000 100打印出gc情况,检查内存使用情况和gc情况

还可以使用工具,配上jconsole配置(linux):

catalina.sh中增加CATALINA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.1.188 -Dcom.sun.management.jmxremote.port=9527 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

 或使用jvisualvm.exe工具。

步骤7:如果内存基本为100%,则可以使用上面的工具进行dump内存文件。然后使用eclipse插件mat进行内存分析,也可以使用命令生成headDump文件。

jmap -dump:format=b,file=/home/gytec/aa.hprof 9665

上述基本可以确定内存中对象分布,结合自己的业务逻辑和代码一般就能分析出哪里有内存泄漏了。

今天太晚了,没图了,下次补图。

猜你喜欢

转载自yang-ch.iteye.com/blog/2287898