我正在尝试调试挂起的 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
有关该过程的其他重要信息:
- 它在 cgexec 下运行。
需要有关如何查找此进程挂起问题的根本原因的指导。
最佳答案
一种方法是获取线程转储并分析它是否存在死锁,查找阻塞的线程并确定它们被阻塞的资源。 如果是 Oracle 热点 VM,则可以运行其他一些实用程序来检查死锁检测。如果进程没有响应,您可以强制进程转储堆栈跟踪(线程转储)。 阅读有关 Oracel JVM 故障排除的更多信息。 https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/hangloop.html
关于java - 调试挂起的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47108704/