перезапустите процесс Java на свалке - PullRequest
1 голос
/ 07 февраля 2012

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

Ответы [ 4 ]

2 голосов
/ 07 февраля 2012

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

Кроме того, в этом случае вам следуетглядя на опцию JVM:

-XX: SoftRefLRUPolicyMSPerMB = someValue

Где 'someValue' - это количество миллисекунд, на которое будет сохраняться мягкая ссылка для каждого свободного Мб памяти,По умолчанию значение равно 1 с / Мб, поэтому, если объект доступен только для мягкого доступа, он будет работать 1 с, если только 1 МБ свободного места в куче свободно

Возможно, это не лучший вариант, но может быть только подсказка?

Ура, Евгений.

0 голосов
/ 07 февраля 2012

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

#!/bin/bash

...

while true; do
  java ... MyClass && break
done
0 голосов
/ 07 февраля 2012

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

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

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

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

0 голосов
/ 07 февраля 2012

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

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

...