Почему 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.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 772
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Похоже, вы зашли в тупик.

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

Если вы не можете подключить отладчик, вы сможете сгенерировать дамп потока, как указал Дастин.

Ответ принят как подходящий

Для любого процесса 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 МБ?

Что произойдет, если Tomcat запущен как служба в Windows? Окна консоли нет, так как же получить дамп потока?

Herms 15.09.2008 23:49

Возможно несколько вариантов - jstack (думаю, только 1.5 или 1.6) или что-то вроде AdaptJ Adaptj.com/main. jstack действительно круто использовать.

DustinB 16.09.2008 07:22

Попробуйте увеличить чувствительность ведения журнала для сервера приложений Tomcat. http://tomcat.apache.org/tomcat-5.5-doc/logging.html

Вы можете повысить чувствительность к НАИБОЛЕЕ или ВСЕ для большинства из них на несколько дней и посмотреть, поможет ли это вам что-нибудь уловить.

Я согласен с созданием нескольких дампов потоков и их просмотром, хотя это: Анализатор дампа потоков

Другие вопросы по теме