使用100%cpu的java

使用100%cpu的java,java,openjdk,Java,Openjdk,我有一个运行在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) 其他症状包括: a。进程的一个线程似乎

我有一个运行在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)
其他症状包括:

a。进程的一个线程似乎在循环中等待某些东西。使用strace跟踪时,连续显示以下o/p:

b。查看正在使用的文件,该过程似乎已经完成。剩下的文件很少。'ls/proc/pid/fd/的输出显示:

有人遇到过类似的情况吗? 任何线索或参考资料都会非常有用

更具体地说,在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。

可能的原因有很多。我能想到的是:

  • 进程的内存使用率非常接近最大堆大小,导致臭名昭著的完全GC。使用
    -Xloggc:/path/to/logFile.log-XX:+PrintGCDetails
    选项启用GC日志,然后使用或之类的工具对其进行分析

  • 您的进程实际上正在做一些事情(比如无限循环),您可以通过执行一些线程转储并分析它们来检查它。你可以用和来做


  • 在将内核升级到kernel-2.6.32-220(即CentOS 6.2内核)后,问题得到了解决。

    正如我前面所说,我可以使用“/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86\u 64/bin/java-version”模拟prb。这表明它既不是gc prb,也不是应用程序中的无限循环。因为上游,在上游内核版本中,从3.14开始,并在3.18中修复。但在某些发行版(如CentOS 6)中,该漏洞是在早期内核版本的后端口中发现的。请参阅本节中的冗长对话
    #!/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
    
    futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)