Почему Tomcat 5.5 (с Java 1.4, работающий в 32-разрядной версии Windows XP) внезапно зависает?
Вопрос
Я уже некоторое время использую Tomcat 5.5 с Java 1.4 с огромным веб-приложением.Большую часть времени он работает нормально, но иногда он просто зависает, без каких-либо исключений, и нет видимого способа заставить его снова запуститься, кроме перезапуска Tomcat.Экземпляру tomcat разрешен гигабайт памяти в куче, но он редко превышает 300 МБ.Кто-нибудь еще сталкивался с этой проблемой и есть ли для нее решение?
В целях разъяснения:Я определил, сколько памяти он использует, через диспетчер задач и через Eclipse (я также пытался запустить его вне Eclipse, но в конечном итоге столкнулся с той же проблемой, хотя это занимает немного больше времени).В Eclipse я смотрю на память, выделенную через небольшую (необязательную) панель памяти, и объем, выделенный для javaw.exe через диспетчер задач.Я использую sysdeo?Плагин tomcat для Eclipse.
Решение
Для любого процесса jvm принудительно создайте дамп потока.В Windows это можно сделать, по-моему, с помощью CTRL-BREAK в окне консоли.
В *nix это почти всегда «kill -3 jvm-pid».
Это может показать, есть ли у вас потоки, ожидающие пула соединений с БД/пула потоков и т. д.
Еще одна вещь, которую следует проверить, — это количество подключений, которые у вас есть в настоящее время к JVM — используйте утилиту NETSTAT или SysInternals, например tcpconn/tcpview (погуглите).
Также попробуйте запустить с флагом JVM verbose:gc.Для Sun JVM запустите как «java -verbose:gc».Это покажет ваши сборки мусора.Если он собирает много (особенно ПОЛНЫЕ КОЛЛЕКЦИИ), то, вероятно, у вас есть утечка памяти.Полные коллекции обходятся дорого, особенно в таких больших кучах.
Как вы определяете, что используется только 300 МБ?
Другие советы
Похоже, вы зашли в тупик.
Если вы можете воспроизвести это в среде разработки, попробуйте подключить отладчик, как только это произойдет.Посмотрите свои темы и посмотрите, есть ли у вас тупики.
Если вы не можете подключить отладчик, вы сможете создать дамп потока, как отметил Дастин.
Попробуйте повысить чувствительность ведения журнала для сервера приложений Tomcat.http://tomcat.apache.org/tomcat-5.5-doc/logging.html
Вы можете увеличить чувствительность к FINEST или ALL для большинства из них на несколько дней и посмотреть, поможет ли это вам что-нибудь уловить.
Я согласен с созданием нескольких дампов потоков и их просмотром: Анализатор дампов потоков