我正在尝试调试一个挂起的java进程。它对大多数JDK工具(如jstats,jmap等)没有响应。
以下是strace的输出:
$ sudo strace -p <pid>
futex(0x7f14bb42a9d0, FUTEX_WAIT, 6090, NULL <unfinished ...>
输出wchan:
$ sudo cat /proc/<pid>/wchan
futex_wait_queue_me%
$sudo strace -f -p <pid>
Process <pid> attached with 15 threads - interrupt to quit
[pid 6105] futex(0x7f14b40cb954, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...>
[pid 6102] futex(0x7f14ba81e860, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 6101] futex(0x7f14b408aa54, FUTEX_WAIT_PRIVATE, 43, NULL <unfinished ...>
[pid 6100] futex(0x7f14b4085f54, FUTEX_WAIT_PRIVATE, 43, NULL <unfinished ...>
[pid 6074] futex(0x7f14bb42a9d0, FUTEX_WAIT, 6090, NULL
有关该过程的其他重要信息:
需要有关如何找到此进程挂起问题的根本原因的指示。
答案 0 :(得分:0)
一种方法是进行线程转储并对其进行一些死锁分析,查找被阻塞的线程并确定它们被阻止的资源。 如果是Oracle热点VM,则可以运行其他几个实用程序来检查死锁检测。如果进程没有响应,则可以强制进程转储堆栈跟踪(线程转储)。 阅读有关Oracel JVM故障排除的更多信息。 https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/hangloop.html