Почему Java-процесс зависает? - PullRequest
1 голос
/ 30 ноября 2010

На моем Java-сервере много потоков.Он зависает, когда один поток рекурсивно вызывает метод бесконечно.После того, как метод вызван 54 раза, процесс зависает, и нет никакого журнала, такого как "StackOverFlow" или "OutOfMemory".

Однако, как я знаю, только поток с проблемой будет аварийно завершать работу, другие потокиможет работать нормально.

окружение:

сервер Linux версии 2.6.31-20 (buildd @ crested) (версия gcc 4.4.1 (Ubuntu 4.4.1-4ubuntu8))Java-версия "1.6.0_18" Java (TM) SE Runtime Environment (сборка 1.6.0_18-b07) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 16.0-b13, смешанный режим)

Ответы [ 4 ]

2 голосов
/ 30 ноября 2010

Все потоки требуют места в стеке. Каждый раз, когда вы вызываете метод рекурсивно, стек расширяется - в конце концов вы закончите.

Количество итераций, которыми вы управляете, зависит от того, какой именно код выполняется.

1 голос
/ 30 ноября 2010

Запросите дамп потока, чтобы увидеть, что делают ваши потоки.Задайте имя для каждой ветки, которую вы разветвляете, чтобы правильно их идентифицировать.Я полагаю, что на объектных мониторах также может быть мертвая блокировка .Я предлагаю использовать JProfiler , чтобы найти объект, на котором потоки заблокированы .

С другой стороны, бесконечная рекурсия не слишком хороша.Избегайте этого или определите для него ограничение.

1 голос
/ 30 ноября 2010

Создайте дамп потока, который покажет вам трассировку стека для каждого потока Java в ВМ. Это скажет вам, что делают потоки, когда JVM зависает.

Чтобы сгенерировать дамп потока, на платформах UNIX вы можете использовать команду kill -QUIT process_id, где process_id - идентификатор процесса вашей Java-программы.

В Windows вы можете ввести последовательность клавиш <ctrl><break> в окне, где была запущена Java-программа. Отправка этого сигнала дает команду обработчику сигнала в JVM рекурсивно распечатывать всю информацию о потоках и мониторах внутри JVM.

0 голосов
/ 30 ноября 2010

Вы ответили на свой вопрос:

Зависает, когда один поток рекурсивный. вызывать метод бесконечно.

Я предлагаю не вызывать метод бесконечно, вы расширяете свой стек очень быстро, так как рекурсивно вызываете метод.

Что вы пытаетесь делать с темами? Можете ли вы оптимизировать свой код для вызова метода без бесконечного цикла?

...