Лучшая практика для обработки утечек памяти в больших проектах Java? - PullRequest
10 голосов
/ 02 июня 2010

Почти во всех крупных Java-проектах, с которыми я был связан, я заметил, что качество обслуживания приложения ухудшается с продолжительностью работы контейнера. Скорее всего, это связано с утечками памяти в коде.

Правильный способ решения этой проблемы, очевидно, состоит в том, чтобы отследить основную причину проблемы и устранить утечки в коде. Быстрый и грязный способ решения проблемы - просто перезапустить Tomcat (или какой-либо контейнер сервлета, который вы используете).

Это мои три вопроса:

  • Предположим, что вы решили решить проблему путем отслеживания основной причины проблемы (утечки памяти), как бы вы собирали данные для увеличения проблемы?

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

  • Удалось ли вам развертывать и запускать проекты в течение длительного периода времени, даже не перезапуская контейнер сервлета для восстановления работоспособности? Или случайный перезапуск сервлета - это то, что нужно просто принять?

Ответы [ 4 ]

9 голосов
/ 02 июня 2010

Предположим, что вы решили решить проблему путем отслеживания основной причины проблемы (утечки памяти), как бы вы собирали данные для увеличения проблемы?

Возьмите дамп кучи с помощью jmap и загрузите дамп с помощью Eclipse Memory Analyzer . Оттуда вы можете проанализировать, какие объекты потребляют больше всего памяти, какие «корни» мешают другим объектам собираться и т. Д.

Существуют и другие программы анализа кучи, например jhat, но я считаю, что EMA - самое быстрое и лучшее (бесплатное) решение.

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

Используйте JMX для мониторинга размера кучи и другой статистики кучи и GC.

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

Да. Избегая / исправляя утечки памяти.

3 голосов
/ 02 июня 2010

, даже если ваш код не имеет реальных проблем, могут быть некоторые утечки памяти, если вы используете apache. проверить http://www.tomcatexpert.com/blog/2010/04/06/tomcats-new-memory-leak-prevention-and-detection для советов и предложений

2 голосов
/ 02 июня 2010

Есть несколько отличных инструментов для профилирования. Научитесь регулярно его использовать и поймите, как распределяется память.

По сути, вы следуете этому процессу для каждой важной функции вашего приложения:

  • Выполнить процесс один раз
  • GC дважды
  • Отметьте текущее количество размещений для всех объектов
  • снова запустить ваш процесс
  • GC дважды
  • Отметить снова
  • Различаются две отметки

Если они не очень близко, возможно, есть утечка.

Если число объектов увеличивается на определенную величину на каждой итерации этого процесса, тогда у вас абсолютно утечка.

1 голос
/ 02 июня 2010

В идеале вам не нужно перезапускать вашу программу или сервлет.

Мой опыт показывает, что большинство причин проблем с памятью обычно возникает из-за проблем с выделением или объединением небольшого набора классов.

Такой инструмент, как VisualVM, отлично подходит для этого, поскольку вы можете выяснить, где находится основная нагрузка при распределении объектов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...