JAVA疑难问题排查、解决经验总结(Linux系统)

本文总结了JAVA问题排查的常见步骤,包括环境检查、CPU占用过高、内存泄漏与溢出、数据库相关问题及SQL优化等。遇到问题时,先检查运行环境,如磁盘空间、内存、CPU、数据库连接等。针对CPU占用过高,通过jstack等工具定位线程。内存问题则通过jstat、jmap等工具分析内存占用,例如发现ConcurrentHashMap$Segment异常增长导致内存泄漏。对于数据库问题,如慢查询,可通过kill命令紧急解决。此外,文章还涉及JBOSS7数据库驱动加载、事务超时、FGC优化等。通过对SQL语句调优,显著提升了查询效率。
摘要由CSDN通过智能技术生成

Java疑难问题的排查、解决有一定的步骤可循。大概就是程咬金的三板斧。按照对应的步骤对着问题砍下去,很多问题就都迎刃而解了。接下来,就根据个人的理解和经验将几类问题的解决步骤总结一下。

先排查运行环境

首先要强调的是,有些问题不是疑难问题,或是伪疑难问题。其实就是些运行环境的问题,磁盘空间、内存大小、CPU占用、数据库连接、用户权限等问题。如果有人向我反馈某个软件启动不了、启动后运行很慢、启动了但整体功能都不正常等问题,首先会使用df -h命令查磁盘空间,使用free -m命令查内存使用情况,使用top命令查看CPU占用情况,使用mysql命令登录数据库show processlist命令查看数据库连接情况。不要以为这样做无意义。通过这些命令解决了问题,就知道这样做多重要。比如说磁盘满了的问题,一般是软件开始时运行是正常的。但是过了一段时间,比如几个月或几年,突然就出现运行慢、重启不了等怪问题了。

某年春节过后,四川移动报告MA(媒资)系统运行异常缓慢。登录到MA服务器排查,发现MA服务器一切正常。由于MA需要数据库,而数据库在另一台服务器上。先使用mysql命令登录数据库show processlist命令查看数据库连接情况。发现有大量链接处于“query end”状态。上网搜索“mysql query end”,说有可能是磁盘空间满了。然后登录数据库服务器,使用df -h命令查磁盘空间,果然满了。Mysql做同步时,会产生大量的二进制日志。不及时清理就会造成磁盘空间占满。Mysql的配置expire_logs_days,可以设置保留日志的天数。设置为30,就不用再为Mysql的日志过多而苦恼了。

从上面的例子可以看出,这些运行环境引起的问题,排查和解决都不难。这类问题解决的重点是要往运行环境上想。如果不查环境,而是看软件日志、查源码什么的。看了大半天也看不出问题。然后才想起查一下环境。然后发现果然是环境问题。那不是要吐血。

但是问题来了,什么样的问题是运行环境引起的问题呢?被定位了是运行环境引起的问题,就是运行环境引起的问题。也就是说运行环境引起的问题没什么特别的现象。所以正如前面强调过的,遇到整体性的软件问题,先查一下环境。

应用的CPU占用过高问题

这种问题的定位过程,网上说的比较多。对一般情况,本文只简单列一下定位过程。1、使用top命令查询出CPU使用率较高的进程ID2、使用top -H -p 进程ID -c命令查询出CPU使用率较高的线程ID,注意是线程ID。一般情况只会有一个线程的CPU使用率较高。3、使用JDK带的jstack 进程ID >> java.txt命令,查出java进程的线程栈方法调用、运行情况。这个命令的结果记得要保存到文件中,而且最好重复三次,保存到3个文件中。4、由于文件中的线程号是十六进制,需要将第二步得到的线程ID转为十六进制,然后在文件中搜索,找到对应的线程栈信息。查看对应的方法调用、运行情况。大概都是应用不小心死循环了、排序算法效率不高、从数据库获取的数据太多等问题引起。

这种一般问题还是比较好定位的,解决的难易,就只能各由天命了。下面说说不一般的情况。上面第二步提到,一般情况只会有一个线程的CPU使用率较高。如果是好几个线程的CPU使用率不是特别高,但是几个加起来就很高的情况,怎么办?如某个Java进程CPU使用率达200%,而查线程时发现,前5个线程的CPU使用率都是30%多。这种情况,我只遇到过一次。我不清楚是否还有其它原因会导致这种情况。在这里,将我遇到的问题的定位、解决描述一下,其它情况用这个思路估计也有帮助。

2017年元旦后上班,发现公司有一台服务器上的tomcat进程占用CPU很高。重启tomcat也不行。使用top -H -p 进程ID -c命令查询,发现有好几个线程的CPU使用率比较高。后来测试也发现别的服务器有此现象。现场客户那里也发现了相同现象。用strace -p 进程ID命令查询系统调用,结果如图:

这种情况在网上搜了半天也没有眉目。把截图发到了公司的大群里问,有人遇到过是闰秒造成的。查了一下,果然在201711日,闰秒了。重启服务器可以解决。如果不想重启服务器,执行/etc/init.d/ntpd stop; date -s now

 

内存泄漏和内存溢出

轻微的内存泄漏一般不宜察觉。内存泄漏较严重,会造成应用速度变慢。更严重的就会造成内存溢出。黑龙江联通现场反馈某市的EPG响应超时较多,希望研发排查。登录到服务器检查运行环境正常。使用jstat -gc 进程ID命令查看堆内存占用情况,发现年老代内存使用率达近100%OCOU分别是年老代空间大小,和年老代已占用空间大小)。

jstat -gc 8052

 S0C     S1C       S0U    S1U     EC       EU        OC         OU       PC         PU    YGC     YGCT    FGC    FGCT     GCT  

138240.0 139392.0  0.0    0.0   769280.0 763627.3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值