我有一个在 CentOS 6.0 上运行的 java 应用程序。它总是通过 cron 在后台运行。有时这个应用程序在使用 100% cpu 时进入等待状态。
我的Java版本是:
java version "1.6.0_17"
OpenJDK Runtime Environment (IcedTea6 1.7.4) (rhel-1.21.b17.el6-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
其他症状是:
一种。该进程的一个线程似乎在循环中等待某事。使用 strace 跟踪时,它会连续显示以下 o/p:
futex(0x7fb8000ac728, FUTEX_WAKE_PRIVATE, 1) = 0 futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
湾。查看正在使用的文件,该过程似乎已完成工作。只剩下几个文件。'ls /proc/pid/fd/ 的输出显示:
lr-x------ 1 root root 64 Jun 22 13:13 0 -> pipe:[77107601] l-wx------ 1 root root 64 Jun 22 13:13 1 -> pipe:[77120162] l-wx------ 1 root root 64 Jun 22 13:13 2 -> /var/log/mithi/mcs/agent_account_mailstore_exceed_limit.sh.log lr-x------ 1 root root 64 Jun 22 13:13 3 -> /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/rt.jar
有没有人遇到过类似的情况?任何线索或参考资料都会非常有帮助。
更具体地说,在 CentOS 6 的后台运行基于 openjdk 的 Java 进程是否存在任何已知问题?
现在我可以用一个非常简单的无限循环来模拟这个问题,如下所示
#!/bin/bash
while [ 1 ]
do
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin/java -version &
sleep 1s
done
当此脚本运行大约 3 - 4 小时时,我发现一两个 java 进程挂起或处于无限循环中,具有相同的症状,即
futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
这仅发生在多处理器系统上,而不是单处理器系统上。它也可以在 RHEL6 上模拟,而不仅仅是 CentOS6。