2012-02-07 5 views
1

Мне нужно перезапустить java-процесс, если он вызывает какие-либо проблемы с памятью, такие как «превышение верхнего предела GC» или «куча Java-кучи». Есть ли какой-то стандартный способ сделать это, как с помощью какого-либо инструмента или опций. Если нет, то как я могу установить watchDog для этого. Я заметил, что мой процесс не падает, когда эти проблемы происходят. И снова перезагрузите его снова.перезапустить java-процесс на куче дампа

+0

Стандартная задача - профилировать использование памяти, чтобы этого не произошло. Или вы можете иметь скрипт, который многократно запускает программу, пока она не будет изящно закрыта. –

+0

Я использовал действительно грязное обходное решение, используя процесс-застройщик, убивая свой собственный процесс, зная, что такое мой PID. – Johnydep

ответ

0

Runtime#freeMemory()Runtime#freeMemory() сообщит вам, сколько памяти доступно на виртуальной машине - вы можете контролировать это и поднимать сигнал тревоги, когда он достигает порога. Calling System.gc() в этом пункте может освободить еще немного памяти, но это не гарантируется и должно рассматриваться как последнее средство.

Вам действительно нужно объединить это с пониманием того, почему у вас заканчивается воспоминание и что-то пытается исправить.

+0

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

+0

Если вы ищете исправление, не включающее изменение кода, вы можете запустить JVM с включенной расширенной сборкой мусора, а затем написать скрипт для мониторинга его вывода. Вы должны уметь распознавать, когда вы приближаетесь к проблеме с памятью (возможно, в тот момент, когда каждая сборка мусора освобождает только очень небольшой процент вашей кучи, а события gc происходят густо и быстро), а затем предпринять необходимые действия - что действительно звучит как перезапуск приложения. – DaveH

2

Есть люди, которые предложит лучшие варианты, так что это всего лишь мои 0,02 $. То, что я сделал некоторое время назад в каком-то приложении, имеет SoftReference для объекта, и время от времени я проверю, является ли этот объект нулевым. SoftReferences собираются (как правило, но не гарантируются) GC непосредственно перед тем, как вы действительно приблизитесь к OutOfMemory, так что вам как-то скажут, что вы действительно близки к неудаче.

Кроме того, в этом случае вы должны смотреть на вариант виртуальной машины Java:

-XX: SoftRefLRUPolicyMSPerMB = SomeValue

Где SomeValue 'это количество миллисекунд, мягкий ссылка будет оставаться для каждого бесплатного Mb памяти. Значение по умолчанию - 1 с/Мб, поэтому, если объект доступен только для достижения цели, он будет длиться 1 с, если только 1 Мб свободного места для кучи

Это, вероятно, не самый лучший вариант, но может быть только намек?

Cheers, Eugene.

0

Вы можете использовать Tanuki Software Java Service Wrapper; он будет обрабатывать Automatic customizable response when something happens in your application or JVM.

Он имеет filter feature, которая будет:

фильтры очень мощное средство, которое дает возможность добавить новое поведение существующих приложений без кодирования. Он работает, контролируя вывод консоли JVM для последовательности текста. Когда они будут найдены, можно предпринять любое количество действий.

Примеры инициируют перезагрузку JVM всякий раз, когда возникает конкретная ошибка. В некоторых приложениях обнаружены ошибки, когда они перестают работать, когда попадают в определенное состояние. Эта функция позволяет немедленно решить такие проблемы, пока они не будут разрешены в приложении.

0

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

#!/bin/bash 

... 

while true; do 
    java ... MyClass && break 
done 
+0

Это не будет работать. Мое приложение по-прежнему будет искалечено даже с исключениями памяти –

Смежные вопросы