GrabDuck

Куда расходуется память в веб-приложении на Java?

:

На сервере запустил веб-приложение на Java и Tomcat с подключением к MySQL. Для ограничения памяти задал следующие опции:

-d64 -server -Xss128k -Xms16M -Xmx32M -XX:PermSize=32M -XX:MaxPermSize=48M -XX:ReservedCodeCacheSize=16M -XX:+UseCompressedOops

Согласно моим ожиданиям, приложении должно занимать в памяти 104Мб (с учётом 64 потоков, реально меньше).

Но после запуска java-процесс занимает примерно 200Мб (судя по полю RES утилиты top). Через несколько часов ничего неделания, приложение уже занимает больше 300Мб.

На что расходуются эти 200Мб памяти и можно ли их как-то ограничить средствами Java?

На странице статистики Tomcat'а статистика по памяти есть, но там отражаются только те области памяти, про которые я и так знаю и которые уже успешно ограничены. В статье на диаграмме есть область памяти Misc, которая занимает достаточно много места, но в самой статье не сказано, что, же входит в эту область памяти. Сам найти не смог, поэтому прошу помощи здесь.

Обновление

Снял дамп, после нескольких минут активной работы с приложением. При снятии дампа процесс java занимал 300Мб памяти, согласно статистике Tomcat'а использовано было всего 64Мб (Heap + PermGen + CodeCache). Открыл дамп в jVisualVM и там указано "Total bytes: 31 966 394". Подозреваю, что анализом одного лишь heap не обойтись.

Что интересно под виндой в диспетчере задач java-процесса занимает мало памяти - порядка 64Мб, как и положено. Может всё-таки дело не в утечках, а в какой-то области памяти типа кеша, про которую я ещё не знаю.