Я думаю о том, как мы выполняем мониторинг памяти JVM с минимальными накладными расходами в производственной среде, даже в напряженный час.
Предположим, у меня есть два сервера приложений tomcat в производстве, за ними настроен баланс нагрузки. Если я могу видеть статистику памяти jvm, я могу сказать балансировке нагрузки прекратить отправку запроса на сервер, который столкнется с проблемой OOM. Это имеет смысл? Jconsole или VisualVM потребляют больше ресурсов, но это не мой выбор.
java
performance
memory
Vance
источник
источник
Ответы:
Ответом будет JMX (Jolokia - это интерфейс JMX).
Вы можете также посмотреть на - /programming/242958/best-tools-to-monitor-tomcat
источник
Другие предоставили предложения о том, как контролировать использование памяти ...
Вроде. Но это не обязательно лучший способ решить вашу проблему.
Давайте вернемся к корню проблемы ... OOMEs. В контексте Tomcat OOME могут быть вызваны одной из следующих причин:
Чтобы решить вашу проблему, сначала нужно выяснить, что из этого происходит ... потому что решение для каждого из них разное.
1) Чтобы проверить, не является ли это утечкой памяти, вам нужно использовать инструмент анализа памяти, чтобы изучить долговременные схемы использования памяти. Это, вероятно, покажет пилообразный рисунок ... что нормально. То, что вам нужно искать, это уровень дна «зубов», растущих со временем вверх. Это указывает на то, что что-то создает мусор, который невозможно собрать; то есть утечка памяти.
Если у вас утечка памяти, лучшее решение - выяснить, какая часть вашего кода ответственна, и исправить ее. Все остальное ... в том числе распределение нагрузки ... является решением проблемы и может привести к ухудшению проблем в будущем.
2) Устранив утечки памяти, вы должны выяснить, заключается ли проблема в том, что вы обрабатываете слишком много запросов одновременно. Я не уверен в лучшем способе сделать это, но если это проблема (или вы подозреваете, что это так), то есть несколько возможных решений:
Настройте конфигурацию сервера Tomcat, чтобы уменьшить количество рабочих потоков.
Если ваши запросы связаны с вводом / выводом, то другой возможностью было бы посмотреть на поддержку асинхронной обработки запросов, доступную в последних версиях спецификации сервлета - см. Http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Но это будет больше работы.
3) Если проблема заключается в том, что определенные запросы используют слишком много памяти, вам нужно выяснить, как обнаружить эти запросы заранее и «справиться с ними». Обнаружение и обработка этих запросов может быть затруднено ... и трудно сообщить без подробностей вашего заявления. Но пара прагматических решений:
Направляйте аномальные запросы на другой сервер с большой кучей ... где OOME не будут мешать "нормальным" запросам.
Увеличьте размер кучи. Если у вас достаточно физической памяти, работа с большей кучей может сделать ваши серверы Tomcat более эффективными ... а также избежать OOMEs.
Таким образом, вместо того, чтобы пытаться сбалансировать нагрузку, чтобы избежать OOME, я предлагаю вам выяснить, почему вы получаете OOMEs ... и попытаться разобраться с причиной OOMEs напрямую.
источник
Может быть, стоит посмотреть на jvmtop .
Он показывает вам "топ-подобный" способ мониторинга показателей на основе jvm, таких как потребление памяти, загрузка ЦП, подсчет потоков и т. Д.
источник