Я уже некоторое время запускаю 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».
Это может показать, есть ли у вас потоки, ожидающие в пуле соединений / пуле потоков db и т. д.
Еще одна вещь, которую следует проверить, - это количество подключений к JVM в настоящее время - используйте утилиту NETSTAT или SysInternals, такую как tcpconn / tcpview (google it).
Также попробуйте запустить с подробным флагом JVM: gc. Для JVM Sun запустите как "java -verbose: gc". Это покажет ваши сборки мусора. Если он собирает много (особенно ПОЛНЫЕ КОЛЛЕКЦИИ), возможно, у вас утечка памяти. Полные коллекции стоят дорого, особенно на таких больших кучах.
Как вы определяете, что используется только 300 МБ?
Возможно несколько вариантов - jstack (думаю, только 1.5 или 1.6) или что-то вроде AdaptJ Adaptj.com/main. jstack действительно круто использовать.
Попробуйте увеличить чувствительность ведения журнала для сервера приложений Tomcat. http://tomcat.apache.org/tomcat-5.5-doc/logging.html
Вы можете повысить чувствительность к НАИБОЛЕЕ или ВСЕ для большинства из них на несколько дней и посмотреть, поможет ли это вам что-нибудь уловить.
Я согласен с созданием нескольких дампов потоков и их просмотром, хотя это: Анализатор дампа потоков
Что произойдет, если Tomcat запущен как служба в Windows? Окна консоли нет, так как же получить дамп потока?