Если использование памяти кучи, показанное в JConsole, обычно возвращается к 0 после GC, нет ли утечки памяти?

Я пытался использовать JConsole, чтобы определить, есть ли у меня утечка памяти.

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

После всего этого, если я несколько раз нажимаю «Выполнить сборщик мусора» в Jconsole, а зеленый график памяти «Куча» возвращается к 0 — значит ли это, при условии, что весь код был выполнен несколько раз, что я (вероятно) не есть утечка памяти?

Или память может утечь в другое место, кроме кучи?


person RonR    schedule 25.02.2015    source источник


Ответы (1)


Я вижу некоторые возможности:

  • Не закрытые соединения
  • Карты с ключами, у которых неправильно реализован метод hashCode/equals
  • в WebApps: данные хранятся в сеансах
  • код очистки не запускается из-за исключений --> В большинстве случаев эти утечки происходят в продакшене, потому что им нужно время для «создания» или особые ситуации: недоступная база данных, ....

Ваш тест - хороший знак, но не гарантия.

person Jordi Laforge    schedule 25.02.2015
comment
Не забывайте об утечках потоков. И утечки загрузчика классов, но они особенные. - person David Ehrmann; 25.02.2015