java基础总结(三十六)--javaweb项目启动后cpu过高

目录

 

1背景

2分析jvm几个常用命令

3HeapAnalyzer使用


1背景

本文jdk版本默认为8

最近在实际项目中总是遇到,启动web项目后查看服务器的cpu被耗尽的情况。(如果项目正常启动则cpu利用率低于5%即硬件配置完全能够跟的上的情况下。)这里简单总结下几条实用的命令。

cpu过高遇见过两次。

   第一次:项目升级后刚开始正常运行,但是过了半个月左右总是会出现cpu被耗尽的情况。web界面无法访问但后台定时任务依然有在运行。

   分析得知:因刚升级的业务中开了四个定时任务,四个定时任务每分钟都会执行一次,而每个定时任务每执行一次都会通过一个公共的方法将收到的字符串格式的报文转换成bean对象,而该公共方法内部处理数据时使用的jar包不正确(类名和方法名都是同样的只是不同的公司开发的)。这个错的jar包能够实现功能但是每调用一次就会创建无法被回收的class类,虽然正确的jar包也会创建无法被回收的class类,但是如果有问题的jar包每使用一次会创建10个class那么新的jar包每使用一次只会创建1个。

  第二次:项目升级后立刻cpu使用了就占完了,但是界面还是可以操作只是界面反应也只比平时慢了一点点,后台的定时任务大部分都能正常执行,但就是会随机的出现某一任务一直执行不了。

   分析得知:现场的服务器一开始启动时会与约800台设备通讯一次。而每通讯一次会触发给所有设备发送比较大的报文。即会发送800*800次相当于每一分钟服务器能处理一百个任务都要处理三天才能处理完。

2分析jvm几个常用命令

2.1查看当前jvm配置信息

      jps -v

    如果是linux需要切换到当前用户查看当前jvm的参数别查看成其他jvm的配置了

2.2实时的查看当前gc执行的次数

    每隔1秒钟打印出jvm当前每个区域详细使用情况: jstat -gcutil  PID  1000

    每隔1秒钟打印出jvm当前每个区域大概情况: jstat -gc  PID  1000

2.3实时的查看当前jvm加载与卸载的class类数量

   每隔1秒钟打印出jvm当前加载与卸载class的信息:jstat -class PID 1000

2.4查看jvm当前时刻正在执行的任务

    可查看是否有死锁,此刻虚拟机内部正在执行哪些代码,将信息打印到test.log文件中:jstack PID  > test.log 

2.5查看jvm中占用内存最多的对象是什么

     jmap -dump:format=b,file=test.bin PID

    将信息打印到名为test.bin的文件中,该文件至少都是一个G.然后通过HeapAnalyzer工具分析该文件。该工具的具体使用在下面写到。

3HeapAnalyzer使用

     下载地址: https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=4544bafe-c7a2-455f-9d43-eb866ea60091

     下载成功后是一个jar包:java基础总结(三十六)--javaweb项目启动后cpu过高

直接运行然后导入刚刚的文件会自动分析。分析界面如下

java基础总结(三十六)--javaweb项目启动后cpu过高

该分析结果对应的java代码如下。

java基础总结(三十六)--javaweb项目启动后cpu过高

补充:如果是真实的项目中出现了必须马上把cpu降下去,出个补丁包来不及的情况。可根据日志、或者界面的数据等停掉消耗比较大的业务,来暂时使得其他业务运行正常。