线程转储显示Runnable状态,但它挂了很长时间

Pra*_*eep 8 java

我们在应用程序中遇到了一个不寻常的问题,在过去的一个月里,我们的应用程序达到了不可恢复的状态,它在应用程序重启后恢复.

背景:我们的应用程序进行数据库查询以获取一些信息,并且此数据库托管在单独的节点上.

有问题的情况:当分析线程转储时,我们看到所有线程都处于可运行状态,从数据库中获取数据,但即使在20分钟后也没有完成.

按预期发布应用程序重启所有线程都已恢复.CPU使用率也很正常.

下面是线程转储

ThreadPool:2:47"prio = 3 tid = 0x0000000007334000 nid = 0x5f runnable [0xfffffd7fe9f54000] java.lang.Thread.State:RUNNABLE at oracle.jdbc.driver.T2CStatement.t2cParseExecuteDescribe(Native Method)at oracle.jdbc.driver.T2CPreparedStatement .executeForDescribe(T2CPreparedStatement.java:518)at oracle.jdbc.driver.T2CPreparedStatement.executeForRows(T2CPreparedStatement.java:764)at ora

All threads in the same state.
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 这个状态可能是什么原因?
  2. 在这种情况下如何恢复?

art*_*tol 2

它可能正在等待来自数据库服务器的网络数据。等待(阻塞)I/O 的 Java 线程被 JVM 描述为处于 RUNNABLE 状态,即使从程序的角度来看它们是阻塞的。