java - 调试挂起的进程

标签 java debugging strace

我正在尝试调试挂起的 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/

相关文章:

java - 启动器不可执行

debugging - 在 Docker 中启用 Wildfly 域模式下的调试 - 端口已在使用中

linux - 在 Strace 命令中查询 PID

r - 如何在R中最大化函数内部使用矩阵乘法来获得最佳效果

windows - 黑莓调试输出

linux - 了解空 C 程序的 strace 输出

c - 在共享库的构建选项中添加 "-rpath,/usr/lib"会导致段错误

java - 如何无限次重复使用单个 Activity ?

java - JVM 中的类加载器

java - 避免将完整的堆栈跟踪扔给 SOAP 客户端