Почему использование памяти моего приложения tomcat продолжает расти? - PullRequest
11 голосов
/ 19 февраля 2009

Мое приложение работает на Windows Server 2000. Использование памяти продолжает расти (с 145 м).

Это нормально? Я новичок в Java. Версия Tomcat5.5.

Ответы [ 6 ]

9 голосов
/ 19 февраля 2009

Если оно только растет, то это утечка памяти. Но если он вырастает до вашей максимальной кучи, а затем падает, то это нормальное поведение при сборке мусора. Есть много инструментов, которые вы можете использовать, чтобы узнать больше. Одним из самых простых является соединение с JConsole (частью JDK) и наблюдение за вашей кучей с течением времени.

Вы также можете посмотреть информацию о сборке мусора с помощью различных ключей и параметров, например, -verbose: gc.

Если вы хотите диагностировать утечки памяти, есть ряд отличных инструментов, в том числе несколько бесплатных, которые работают с Eclipse, NetBeans, IntelliJ и т. Д.

6 голосов
/ 19 февраля 2009

Поведение HotSpot сервера Sun по умолчанию заключается в увеличении кучи, а не в очистке SoftReference s (используется для кэшей). По умолчанию они оставались на одну секунду для каждого мегабайта максимального доступного размера кучи. Итак, ожидайте, что куча вырастет до максимального размера. Если у вас действительно не хватает памяти с OutOfMemoryException или производительность снижается (из-за чрезмерного ГХ или небольших кешей), вам нужно искать утечки памяти.

Также серверы Tomcat часто страдают от утечек памяти после перезагрузки приложений. Например, Tomcat разделяет потоки между всеми приложениями, что часто приводит к тому, что реализация Sun ThreadLocal неправильно сохраняет значения.

4 голосов
/ 19 февраля 2009

С программой Лямбда-зонд вы можете легко посмотреть на использование памяти в Tomcat. (опция Системная информация - Использование памяти). Вы можете увидеть на графике Survivor Space Perm Gen Tenured Gen Eden Space Code Cache

Просто разверните этот warfile на tomcat и установите опцию запуска -Dcom.sun.management.jmxremote для запуска Java.

Теперь вы можете видеть, какая часть памяти увеличивается.

4 голосов
/ 19 февраля 2009

ИМО Том Хоутин - лучший ответ. Он растет, пока не достигнет максимума, затем запускает GC. В серверной среде это имеет смысл: вам нужна лучшая производительность, а не лучшее использование памяти. Вы предварительно рассчитываете общий объем памяти, затем даете каждому приложению максимум, а затем все подходит и имеет наилучшую производительность. Это поведение может быть изменено.

Используйте jconsole, чтобы посмотреть, сколько на самом деле используется. Сделайте GC и посмотрите, к чему это приведет. Это число не должно расти со временем, иначе у вас утечка памяти. Используйте visualvm для отладки утечки памяти.

Каждый раз, когда вы перезагружаете приложение, оно использует дополнительную память Perm Gen, которая не может быть восстановлена ​​(в Sun JVM другие, такие как JRockit, не имеют этой проблемы). В производстве вы не должны перезагружать приложение. Перезагрузите Tomcat каждый раз. Если вы действительно хотите продолжать это делать, вы можете увеличить максимальную память, а также увеличить память Max Perm Gen с флагом -XX: MaxPermSize = 256m

1 голос
/ 19 февраля 2009

Это не нормально и, вероятно, свидетельствует о утечке памяти .

Вы должны попытаться использовать профилировщик памяти , чтобы увидеть, где происходит утечка вашего приложения.

В общем, вы должны искать циклы или повторяющиеся операции, когда объекты создаются, но не правильно утилизируются .

0 голосов
/ 19 февраля 2009

Возможно, у вас утечка памяти. Сначала я подключу jconsole к вашему приложению, чтобы определить, является ли это пространством permgen или просто кучей памяти, а затем приступлю к выяснению места утечки. Можете ли вы дать нам больше информации? Что происходит в вашем приложении с ростом памяти?

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

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