tomcat请求无响应原因排查

345 阅读1分钟

卡死原因推测

初步推测应当出现了资源竞争,线程得不到资源遂无法继续进行

关注点在于,新线程需要什么资源,以及占了资源而不释放的线程

通过jdk自带jstack命令查看

jstack可以打印指定java进程的线程的栈轨迹

jstack -l 15664 > jstack.log

发现较多http请求的线程处于waiting状态,获取redis资源导致的问题,发现是redis关闭不完善导致

"http-nio-8080-exec-84" #196 daemon prio=5 os_prio=0 tid=0x00007ff394e7e800 nid=0x22e5 waiting on condition [0x00007ff36b213000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x000000008a5fec58> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
	at redis.clients.util.Pool.getResource(Pool.java:49)
	at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)

其它

linux下临时配置环境变量

export JAVA_HOME=/usr/share/jdk
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar