代码之家  ›  专栏  ›  技术社区  ›  black sensei

如何指出线程在threadump文件中处于等待状态的原因

  •  0
  • black sensei  · 技术社区  · 7 年前

    我在AWS M4.xlarge so 4 CPU,16 GB RAM上有一个Linux信任。它在ToMCAT7和Oracle Java 8上运行Java应用程序。

    应用程序经常挂起,不接受任何其他连接。由于响应超时,状态蛋糕将报告它已关闭。数据狗将显示线程已最大化。但是CPU没有增加(仅占使用率的10%)。在此期间,RAM使用保持不变。

    我希望能在这里得到帮助,最终掌握加密线程转储文件的技巧。我把它附在这里,也把它上传到 fastthread.io and it says there is no problem 。我也上传了完整的 threadump on zerobin

    如果这里有人能为这件事开灯,我将非常感激,我希望它能帮助处于同样情况下的其他人。事先谢谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Andrey Cheboksarov    7 年前

    很多线程都处于等待状态,这对它们来说是完全正常的。例如,有些线程具有以下堆栈跟踪:

    ...
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
    ...
    

    这只意味着线程正在等待任何任务。

    但是,其他堆栈看起来不太好。

    java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at com.mchange.v2.resourcepool.BasicResourcePool.**awaitAvailable**(BasicResourcePool.java:1414)
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
    - locked <0x000000055c2d3ce0> (a com.mchange.v2.resourcepool.BasicResourcePool)
    at 
    com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)
    

    这些线程正在等待池中的连接可用。c3p0是一个数据库连接池。而不是每次都创建新的连接,而是将它们缓存在池中。关闭后,连接本身不会关闭,而是返回池。因此,如果由于某种原因休眠(或其他用户)在释放连接后不关闭连接,那么池可能会耗尽。

    为了解决一个问题,您必须找出一些连接在使用后没有关闭的原因。尝试查看您的代码来执行此操作。

    另一种选择是暂时不使用c3p0(池)。这不是永远的,但至少你可以检查这个猜测是否正确。