记录一次tomcat总是挂掉,jvm崩溃问题,httpclent请求没有设置超时,导致的线程大量等待

1、起因

近期我们有一tomcat总会一个礼拜或者3、5天出现一次程序崩溃,通过查看catalina.out的最后日志,总是提示某一个jar 出现unzip??? 怀疑是内存溢出或者是资源不够用线程太多等导致的崩溃

2、排查过程

通过排查 tomcat/bin下面的JVM错误日志hs_err_pid<pid>.log

1、先看最近的10件GC事件:GC Heap History (10 events):

从这些日志记录来看,gc before和gc after 的full 都是29(full 29表示已经进行了29次Full GC),表示的GC事件并不是Full GC,而是Young GC。每次GC后在Young Generation中回收了部分内存,Old Generation使用量略有增加。jvm的内存还是够用的,排除是jvm内存不够导致崩溃

2、看java的线程:Java Threads: ( => current thread ),统计了下 有3w多线程处于线程阻塞状态,怀疑是因为线程太多造成的jvm崩溃

3、但是从hs_err_pid<pid>.log看不出是那些线程导致的,写了如下shell脚本,使用jstack用于进一步诊断和分析目前在用的tomcat程序当前在跑的线程状态和调用情况,

通过crontab -e 定时每30分钟执行该脚本

#!/bin/bash
source /etc/profile
#获取再跑的tomcat的pid
pid=`ps -ef|grep bin/bootstrap.jar|grep -v grep|awk '{print $2}'`
echo $pid
outfile=jvm_stat.txt
currenttime=$(date "+%Y-%m-%d_%H:%M:%S") 
#添加时间到jvm_stat.txt
echo $currenttime >> /root/jslog/jvm_stat.txt
#查看目前jvm的情况
jstat -gcutil $pid >> /root/jslog/jvm_stat.txt

#jstack  生成当前线程的情况

jstack -l $pid > /root/jslog/"$currenttime.txt"

4、后面发现当程序崩溃的前几个线程文件都比平时大了2倍左右,对比几个文件发现,有一个httputil里面的方法在线程文件逐渐变多,发现有很多线程是调用的很早以前写的一个httputil的类 (对比的时候可以先从,你们写的类找比如查找com.youcompany....)

5、后面找到这个方法里面,发现这个方法是发送http请求的,但是每个请求都没有设置超时时间,所以导致的,资源无法释放

3、解决问题 

修改httputil的方法,每个方法在加一个方法,添加一个timeout的参数,给之前没有设置timout的设置一个默认的timeout参数

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值