Java использует 100% процессор

У меня есть java-приложение, работающее на CentOS 6.0. Он всегда работает в фоновом режиме через cron. Иногда это приложение переходит в состояние ожидания при использовании 100% процессора.

Моя версия 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 (время ожидания соединения истекло)

б. Похоже, что процесс завершил работу, глядя на файлы, которые он использует. Осталось всего несколько файлов. Вывод 'ls /proc/pid/fd/ показывает:

lr-x------ 1 root root 64 22 июня 13:13 0 -> pipe:[77107601]
l-wx------ 1 root root 64 22 июня 13:13 1 -> pipe:[77120162]
l-wx------ 1 root root 64 22 июня 13:13 2 -> /var/log/mithi/mcs/agent_account_mailstore_exceed_limit.sh.log
lr-x------ 1 root root 64 22 июня 13:13 3 -> /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/rt.jar

Кто-нибудь сталкивался с подобной ситуацией? Любые подсказки или ссылки были бы очень полезны.

В частности, известны ли какие-либо известные проблемы с запуском Java-процессов на основе openjdk в фоновом режиме в 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

Когда этот скрипт выполняется в течение примерно 3–4 часов, я обнаруживаю один или два java-процесса, которые зависли или находятся в бесконечном цикле. с идентичным симптомом, т.е.

futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)

Это происходит только в многопроцессорных системах, а не в однопроцессорных. Его также можно смоделировать на RHEL6, а не только на CentOS6.

5
задан amolkul 2 July 2012 в 12:27
поделиться