Веб-приложение на Java: как определить проблему с памятью?

Я использую несколько классическое веб-приложение mvc postgres/ hibernate / spring с довольно обычными слоями / фреймворками. Все выглядит хорошо, за исключением случаев, когда я смотрю на граф памяти в javamelody: мне периодически кажется, что он растет, вызывается gc, затем снова растет: граф памяти

Когда я выкидываю память, это всегда файл 60/80 Мо, показывающий, что общий объем используемой памяти составляет около 60/80 Мо, и утечка не обнаружена. Если я удаляю javamelody и использую jconsole, это как бы показывает ту же проблему, память продолжает расти (немного медленнее) Как я могу увидеть, что это за объекты +100Mo, которые постоянно растут, а затем растут? Как я могу решить эту проблему?

Любая помощь или объяснения относительно такого рода проблем будет принята с благодарностью!

Спасибо заранее

РЕДАКТИРОВАТЬ: я забыл упомянуть, что график происходит из изолированной среды, без каких-либо действий пользователя (нет HTTP-запроса / нет запланированной работы)

2 ответа

Это ожидаемое поведение сборщика мусора Java. Краткосрочные объекты накапливаются в памяти до тех пор, пока алгоритм сбора мусора не определит, что стоит потратить время на восстановление этой памяти.

Вы можете проанализировать дамп памяти (например, с помощью Eclipse Memory Analyzer), чтобы выяснить, где находятся эти объекты, но помните, что эта ситуация не является проблемой (если только они не съедают всю вашу память и не генерируется ошибка OutOfMemoryError).

Кажется, что сервер приложений или веб-контейнер, в котором развернуто приложение, выполняет некоторый фоновый процесс (JBoss имеет пакетный процесс, который пытается восстановить распределенную транзакцию). Включите запись трассировки и посмотрите, что она говорит. Но вам не о чем беспокоиться.

Другие вопросы по тегам