java 使用 100% cpu

标签 java

我有一个在 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:

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)

b.查看它正在使用的文件,该过程似乎已经完成工作。仅剩下很少的文件。 '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)

这种情况仅发生在多处理器系统上,而不是单处理器系统上。不仅是CentOS6,在RHEL6上也可以模拟。

最佳答案

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

  1. 您的进程的内存使用量非常接近最大堆大小,从而导致臭名昭著的 Full GC。使用 -Xloggc:/path/to/logFile.log -XX:+PrintGCDetails 启用 GC 日志选项,然后使用 GCViewer 等工具对其进行分析或HPJmeter .

  2. 您的进程实际上正在执行某些操作(例如无限循环),您可以通过执行一些线程转储并分析它们来检查它。您可以使用 VisualVM 来做到这一点和 Thread Dump Analyzer .

关于java 使用 100% cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11152334/

相关文章:

java - 数组列表。按产品类型按文章访问名称

java - Mac 上的 SWT 问题

java - 是否可以在没有官方 oracle dmg 文件的情况下在 mac os x 上安装 JDK 7 或 8?

java - Zoho Rest 发票 API 返回 400 错误,Java HttpClient

java - 注解可以完全取代标记接口(interface)吗?

java - 安装了两个JDK,如何在Eclipse中切换java编译器

java - 如何为 Google Guice 中的特定类型分配默认的 'fallback' 提供程序

java - 部署 war 在 docker 中抛出类未找到异常

java - jar 的最佳去处

java - Thread类的方法与Thread.currentThread()所使用的方法之间的区别?