Я знаю, что это не "лучшая практика", но я хотел бы знать, могу ли я автоматически перезапустить tomcat, если мое развернутое приложение выбрасывает исключение outofmemory
Могу ли я автоматически перезапустить tomcat jvm из-за исключения из памяти
Ответ 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\`"