Могу ли я автоматически перезапустить Tomcat JVM на исключение нехватки памяти - PullRequest
20 голосов
/ 13 сентября 2011

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

Ответы [ 6 ]

23 голосов
/ 29 октября 2012

Вы можете попытаться использовать опцию JOM OnOutOfMemoryError

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

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

-XX:+HeapDumpOnOutOfMemoryError

Будьте осторожны, комбинируя эти два параметра,Если принудительно завершить процесс в «tomcat-restart», дамп кучи может быть не завершен.

6 голосов
/ 13 сентября 2011

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

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

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, конечно, еще один хороший инструмент.

5 голосов
/ 13 сентября 2011

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

4 голосов
/ 13 сентября 2011

Как правило, нет. Виртуальная машина находится в плохом состоянии и ей нельзя полностью доверять.

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

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

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

2 голосов
/ 02 ноября 2017

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

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

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

0 голосов
/ 10 августа 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...