Возможные утечки памяти на простом сайте JSP - PullRequest
0 голосов
/ 31 августа 2009

Прежде всего, я лгу, это не совсем простой сайт JSP. Он имеет пару страниц с доступом к базе данных и поисковую систему на основе lucene ... и около 400 отдельных jsp страниц.

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

Я не эксперт по jsp, но подозреваю, что это не утечка памяти, и что страницы базы данных и поиск lucene не имеют ничего общего с этой проблемой. Я понимаю, что каждая страница jsp компилируется в класс java, затем выполняется и сохраняется в памяти для последующего доступа.

Реальный вопрос: может ли это увеличенное (для 400, я думаю, да) количество автономных страниц JSP вызвать увеличение использования памяти до 200M?

И если да, как бы вы снизили использование памяти? Можно использовать SSI для включений (избегая использования страниц jsp для этой цели)?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 04 сентября 2009

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

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

1 голос
/ 01 сентября 2009

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

  • Используйте утилиту jmap (поставляется с JDK), чтобы получить дамп кучи. Он должен быть запущен от имени root!
  • Загрузить файл на локальный компьютер
  • Загрузите и установите Eclipse Memory Analyzer - Есть и другие (например, jhat ), но мне лично это нравится.
  • Открыть файл вместе с ним
  • Посмотрите, какие классы занимают большую часть памяти.

Несмотря на это, всегда хорошо предварительно скомпилировать JSP перед загрузкой сервера.

0 голосов
/ 13 сентября 2009

Вам необходимо определить, где эта память расходуется. Утверждение о том, что 200 МБ - это слишком много, на самом деле бесполезно, поскольку оно зависит от использования, от того, как приложение использует память (например, данные сеанса, как упомянул Дэвид). Вам необходимо проанализировать дампы кучи и подробные журналы gc из разных периодов в жизненном цикле приложения, чтобы понять, как они используются, и есть ли у вас утечка памяти (если приложение стабильно на 200 МБ, то нет. Если оно увеличивается каждые x часов без признаков уменьшения, вы, вероятно, делаете).

...