Утечка памяти из-за HashMap - PullRequest
1 голос
/ 27 февраля 2012

Я сталкиваюсь с утечкой памяти из-за HashMap в моем коде. При первом входе в приложение это HashMap заполняется, и я использую Map для кэширования некоторых данных.

Я использовал эти кэшированные данные в нескольких местах моего приложения.

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

Но после этого оно снова начинает расти. Это, конечно, утечка памяти, но как мне ее избежать?

Мой профилировщик также показывает ResultSet.getString() и Statement.execute() в качестве выделения памяти горячей точки. эти методы используются для заполнения этого кэша.

Есть ли утечка памяти из-за этих методов? Я закрыл соединение с БД в блоке finally.

Почему он до сих пор показывает мне эти методы?

1 Ответ

3 голосов
/ 27 февраля 2012

Как поясняют комментарии выше, это не похоже на утечку памяти.

В Java-приложении JVM будет создавать объекты и использовать память. Со временем некоторые из объектов выйдут из области видимости (получат право на сборку мусора), но до следующего сбора они все равно будут находиться в куче, «используя память». Это не проблема, это то, как работает Java. Когда JVM решает, что ей нужно освободить память, она запускает коллекцию, и используемая память должна быть отброшена.

Должны ли вы заботиться о том, что вы видите? Я могу придумать две причины, по которым ты должен, и одну, почему не стоит. Если ваши сборщики мусора освобождают достаточно памяти для продолжения работы приложения, сборки не влияют на производительность и вы заняты другими делами, то я не вижу причин, по которым вам следует позаботиться.

Если, однако, вас беспокоит, что вы не понимаете, как приложение работает в деталях, или у вас есть причина, по которой возникает проблема с «большим объемом памяти» (вы захотите запустить приложение с еще большим количеством данных в будущем, или вы захотите запустить его с меньшим количеством назначенной кучи в будущем), тогда вы, возможно, захотите исследовать.

Если память используется, когда приложение ничего не делает, я бы остановился на этом. Что он на самом деле делает, когда он ничего не делает? Могу поспорить, что он делает «что-то»

...