Подтвердить что ты не робот

Почему использование памяти приложения tomcat продолжает расти?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Просто установите этот warfile на tomcat и установите параметр запуска -Dcom.sun.management.jmxповторить запуск Java.

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

Ответ 5

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

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

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

Ответ 6

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

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