Подтвердить что ты не робот

Могу ли я автоматически перезапустить tomcat jvm из-за исключения из памяти

Я знаю, что это не "лучшая практика", но я хотел бы знать, могу ли я автоматически перезапустить tomcat, если мое развернутое приложение выбрасывает исключение outofmemory

4b9b3361

Ответ 1

Вы можете попробовать использовать опцию OnOutOfMemoryError JVM

-XX:OnOutOfMemoryError="/yourscripts/tomcat-restart"

Также возможно сгенерировать кучу кучи для последующего анализа:

-XX:+HeapDumpOnOutOfMemoryError

Соблюдайте эти два параметра. Если вы принудительно убиваете процесс в "tomcat-restart", куча кучи может быть не полной.

Ответ 2

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

Некоторые очень полезные инструменты для отслеживания утечек памяти:

jdk/bin/jmap -histo:live pid

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

jdk/bin/jmap -dump:live,file=heap.hprof pid

Это сбрасывает всю кучу JVM, идентифицированной pid. Затем вы можете использовать большой Eclipse Memory Analyzer, чтобы проверить его и узнать, кто держится за ссылки на ваши объекты. Вашими двумя крупнейшими друзьями в Eclipse Memory Analyzer являются гистограмма и right click -> references -> exclude weak/soft references, чтобы увидеть, что ссылается на ваш объект.

jconsole - это, конечно, еще один хороший инструмент.

Ответ 3

не легко, и определенно не через JVM, который просто страдал из-за исключения из памяти. Лучшим выбором будет некоторая комбинация монитора состояния tomcat в сочетании с cron-скриптами или связанными сценариями системного администратора; что-то проверить статус сервера и автоматически остановить и перезапустить службу, если она не удалась.

Ответ 4

Как правило, нет. VM - это плохое состояние и не может быть полностью доверено.

Как правило, можно использовать настраиваемый процесс обертки, который запускает и останавливает "настоящую" виртуальную машину сервера, которую вы хотите. Пример, с которым я работал, - это "Java Service Wrapper" от программного обеспечения Tanuki http://wrapper.tanukisoftware.com/doc/english/download.jsp

Я знаю, что есть другие.

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

Ответ 5

К сожалению, когда вы убиваете Java-процесс. Ваш script сохранит ссылку на порты tomcat 8080 8005 8009, и вы не сможете запустить его снова из того же script. Единственный способ, которым это работает для меня, это:

-XX: OnOutOfMemoryError = "kill -9% p", а затем другой cron или monit или что-то подобное, чтобы убедиться, что tomcat работает снова.

% p на самом деле является JVM pid, что JVM предоставляет вам.

Ответ 6

Как насчет чего-то подобного? -XX:OnOutOfMemoryError="exec \`ps --no-heading -p $$ -o cmd\`"