Мне нужно перезапустить java-процесс, если он вызывает какие-либо проблемы с памятью, такие как «превышение верхнего предела GC» или «куча Java-кучи». Есть ли какой-то стандартный способ сделать это, как с помощью какого-либо инструмента или опций. Если нет, то как я могу установить watchDog для этого. Я заметил, что мой процесс не падает, когда эти проблемы происходят. И снова перезагрузите его снова.перезапустить java-процесс на куче дампа
ответ
Runtime#freeMemory()
Runtime#freeMemory()
сообщит вам, сколько памяти доступно на виртуальной машине - вы можете контролировать это и поднимать сигнал тревоги, когда он достигает порога. Calling System.gc() в этом пункте может освободить еще немного памяти, но это не гарантируется и должно рассматриваться как последнее средство.
Вам действительно нужно объединить это с пониманием того, почему у вас заканчивается воспоминание и что-то пытается исправить.
Я согласен, что в моей программе есть утечки памяти. Но тогда там, в производстве, пока не придет мое следующее исправление, шоу должно продолжаться. –
Если вы ищете исправление, не включающее изменение кода, вы можете запустить JVM с включенной расширенной сборкой мусора, а затем написать скрипт для мониторинга его вывода. Вы должны уметь распознавать, когда вы приближаетесь к проблеме с памятью (возможно, в тот момент, когда каждая сборка мусора освобождает только очень небольшой процент вашей кучи, а события gc происходят густо и быстро), а затем предпринять необходимые действия - что действительно звучит как перезапуск приложения. – DaveH
Есть люди, которые предложит лучшие варианты, так что это всего лишь мои 0,02 $. То, что я сделал некоторое время назад в каком-то приложении, имеет SoftReference для объекта, и время от времени я проверю, является ли этот объект нулевым. SoftReferences собираются (как правило, но не гарантируются) GC непосредственно перед тем, как вы действительно приблизитесь к OutOfMemory, так что вам как-то скажут, что вы действительно близки к неудаче.
Кроме того, в этом случае вы должны смотреть на вариант виртуальной машины Java:
-XX: SoftRefLRUPolicyMSPerMB = SomeValue
Где SomeValue 'это количество миллисекунд, мягкий ссылка будет оставаться для каждого бесплатного Mb памяти. Значение по умолчанию - 1 с/Мб, поэтому, если объект доступен только для достижения цели, он будет длиться 1 с, если только 1 Мб свободного места для кучи
Это, вероятно, не самый лучший вариант, но может быть только намек?
Cheers, Eugene.
Вы можете использовать Tanuki Software Java Service Wrapper; он будет обрабатывать Automatic customizable response when something happens in your application or JVM.
Он имеет filter
feature, которая будет:
фильтры очень мощное средство, которое дает возможность добавить новое поведение существующих приложений без кодирования. Он работает, контролируя вывод консоли JVM для последовательности текста. Когда они будут найдены, можно предпринять любое количество действий.
Примеры инициируют перезагрузку JVM всякий раз, когда возникает конкретная ошибка. В некоторых приложениях обнаружены ошибки, когда они перестают работать, когда попадают в определенное состояние. Эта функция позволяет немедленно решить такие проблемы, пока они не будут разрешены в приложении.
Предполагая, что ваше приложение Java вернет 0 при грациозном завершении работы, сценарий ниже оболочки может служить ролью сторожевого пса.
#!/bin/bash
...
while true; do
java ... MyClass && break
done
Это не будет работать. Мое приложение по-прежнему будет искалечено даже с исключениями памяти –
- 1. Невозможные ссылки на память Java в куче дампа
- 2. Роль запросов на спящий режим в куче дампа
- 3. Создание объекта на куче
- 4. max_heapify процедура на куче
- 5. Объявление массива на куче
- 6. Как структура на куче освобождена?
- 7. C++ Многомерные массивы на куче
- 8. Многомерный массив на куче - C
- 9. Объекты на куче и ссылки
- 10. Хранение 3D VLA на куче
- 11. Создание объекта на стеке/куче?
- 12. создания объекта на стеке/куче
- 13. , образующая встроенного типа на куче
- 14. Это на стеке или куче?
- 15. Амортизированный анализ на мини-куче?
- 16. Динамический многомерный массив на куче
- 17. программа заканчивается динамической памятью на куче
- 18. эквивалент дампа ядра для Java
- 19. Структуры на классах стека на куче
- 20. Hibernate - на стеке или на куче?
- 21. Восстановление базы данных из дампа
- 22. Восстановление дампа на удаленном компьютере
- 23. На лету анонимность дампа MySQL
- 24. Куча дампа на Java 1.4.1
- 25. О куче дампа для weblogic JRockit, использование кучи было полностью съедено, но размер кучи кучи невелик
- 26. Как перезапустить функцию setup() на arduino из C#? (перезапустить arduino)
- 27. Перезапустить Tomcat на Jelastic автоматически
- 28. Перезапустить приложение автоматически на KILL
- 29. Перезапустить агент параллелизма на C++?
- 30. Перезапустить IIS на удаленном компьютере
Стандартная задача - профилировать использование памяти, чтобы этого не произошло. Или вы можете иметь скрипт, который многократно запускает программу, пока она не будет изящно закрыта. –
Я использовал действительно грязное обходное решение, используя процесс-застройщик, убивая свой собственный процесс, зная, что такое мой PID. – Johnydep