2012-06-19 5 views
8

У меня есть веб-приложение tomcat на VPS и tomcat иногда (примерно раз в месяц) выходит из строя из-за ошибки в catalina.out:Я получаю сообщение о вирусе на базе Java HotSpot (TM) 64-разрядного сервера: Исключение java.lang.OutOfMemoryError произошло отправка сигнала SIGTERM в обработчик «ошибка в tomcat

Java HotSpot (ТМ) 64-разрядного сервера предупреждения ВМ: Исключение java.lang.OutOfMemoryError произошло диспетчеризации сигнала SIGTERM к handler- ВМ может потребоваться принудительно закрывается ,

Вот некоторые подробности о моей конфигурации:

  • VPS: Debian-5.0-x86_64

  • Оперативная память: 2,5 ГБ,

  • виртуальных процессоров: 8

  • HDD: 60gb hdd - 70% бесплатно

  • Tomcat 7,0

  • Java -версия:

    java version "1.6.0_18" 
    OpenJDK Runtime Environment (IcedTea6 1.8.13) (6b18-1.8.13-0+squeeze1) 
    OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode) 
    
  • Java Титулы: -Xms512m -Xmx1024m

Я также Apache-PHP на этом сервере.

Я отслеживаю загрузку сервера с помощью Munin, и это показывает мне, что память и использование ЦП всегда стабильны, и никаких сбоев до сбоя не было.

Я также записываю использование памяти java через класс java.lang.Runtime, и это показывает, что jvm всегда использует память max200Mb, и до сбоя не было увеличения. Последний журнал перед сбоем был 40 секунд назад, и это время использовало память: 152Mb.

Мое веб-приложение также запускает 6-7 потоков, которые собирают данные из разных публичных API. Эти потоки начинаются при запуске tomcat, и они всегда работают с периодическими снами.

Не могли бы вы рассказать мне, почему он падает? Как я могу найти причину?

ответ

0
  • Run top из оболочки и посмотреть, сколько памяти Linux утверждает, что процесс Java берет вверх.

  • Проверьте общее использование памяти в аппарате. Может быть, что другие процессы потребляют всю память, заставляя Linux убивать JVM. Вероятно, такая база данных, как Mysql или Postgress.

  • Проверка /var/log/messages в периоды времени вокруг сбоев за необычные события.

0

Вы можете отредактировать service.bat или услугу.ш файл (находится в бен папке deistribution) и поместите ниже двух Jvm параметров

XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<PATH_TO_WRITE_DUMP> 

PATH_TO_WRITE_DUMP должны иметь необходимые разрешения, После получения файла дампа кучи, который будет создан в случае OutOfMemory вопроса, анализируйте его либо вручную, либо некоторыми сторонними инструментами. Вы можете загрузить этот файл в jvisualvm и сделать некоторый анализ, или вы можете использовать Memory-Analyzer-Plugin eclipse, он очень полезен и дает некоторые потенциальные подозрения в утечке памяти и деревья доминанта (т.е. какой объект доминирует в куче) Это может быть хорошая отправная точка.

0

увеличения вы память запуска Tomcat Java, как: набор JAVA_OPTS = -server -Xms256m -Xmx512m

0

Позволяет распороть это:

Исключения java.lang.OutOfMemoryError произошло диспетчерской сигнал SIGTERM для handler- может потребоваться принудительное прекращение работы виртуальной машины.

Прежде всего, похоже, что что-то отправило процессу JVM (Tomcat) сигнал SIGTERM. Это должно быть чем-то внешним для JVM, который это сделал. JVM не посылает сигналы самому себе .

Итак, вам нужно выяснить, что это делает. Я предполагаю, что сначала будет убийцей OOM ... но убийца OOM использует SIGKILL, а не SIGTERM. И JVM никогда не видит выхода SIGKILL!

(Вы можете подтвердить, что это не ООМ убийца, глядя в «/ вар/Журнал/сообщений» ... или там, где ваши системные журналы сообщения ядра. См How to Configure the Linux Out-of-Memory Killer)

Если это не ООМ убийца, то есть несколько способов, чтобы найти источник сигнала:

И как только у вас есть источник сигнала, вы будете иметь подсказки относительно того, почему он был послан.


Другой Примечательно то, что произошло OutOfMemoryError при обращении с SIGTERM. Это наводит на мысль, что основная причина заключается в том, что что-то обнаружило, что Tomcat использует слишком много памяти и отправил ему SIGTERM, чтобы заставить его уйти (чисто). Я предполагаю, что тогда происходит то, что JVM отправляется в ОС, чтобы попросить немного больше памяти (для обработки SIGTERM), а ОС говорит «Нет», а JVM выбрасывает OutOfMemoryError. К сожалению, JVM теперь находится в состоянии, когда он не может либо выйти из строя, либо восстановить. Следовательно, он говорит, что «виртуальная машина, возможно, потребуется принудительно прекратить».


В любом случае. Это выглядит как довольно необычное проявление общей проблемы Java. У вас, скорее всего, есть ошибка в веб-приложениях, запущенных в вашем Tomcat, которые вызывают утечку памяти. Если это так, единственное реальное решение - найти и исправить ошибку. (Увеличение размера кучи ... если возможно ... только устраняет проблему. Это может уменьшить интервал между сбоями, но вряд ли это предотвратит их.)

Предполагая, что вы готовы стиснуть зубы:


1 - Если что-то не делать что-то ореховый в родном коде ...