我在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。
答案 0 :(得分:4)
有很多可能的原因。那些,我能想到的:
您的进程内存使用量非常接近最大堆大小,导致臭名昭着的Full GC。使用-Xloggc:/path/to/logFile.log -XX:+PrintGCDetails
选项启用GC日志,然后使用GCViewer或HPJmeter等工具对其进行分析。
您的进程实际上正在做某事(比如无限循环),您可以通过执行一些线程转储并对其进行分析来检查它。您可以使用VisualVM和Thread Dump Analyzer。
答案 1 :(得分:1)
将内核升级到CentOS 6.2内核kernel-2.6.32-220后问题得以解决。