такое утечка памяти? почему java.lang.ref.Finalizer съедает столько памяти - PullRequest
57 голосов
/ 02 декабря 2011

Я запустил дамп кучи в моей программе.Открыв его в анализаторе памяти, я обнаружил, что java.lang.ref.Finalizer для org.logicalcobwebs.proxool.ProxyStatement занимает много памяти.Почему это так?

screenshot

Ответы [ 2 ]

62 голосов
/ 02 декабря 2011

Некоторые классы реализуют метод Object.finalize().Объекты, которые переопределяют этот метод, должны вызываться финализатором вызова фонового потока, и они не могут быть очищены, пока это не произойдет.Если эти задачи короткие, и вы не отбрасываете многие из них, все это работает хорошо.Однако, если вы создаете много этих объектов и / или их финализаторы занимают много времени, очередь объектов, подлежащих финализации, накапливается.Эта очередь может использовать всю память.

Решение состоит в том, чтобы

  • не использовать объекты finalize () d, если вы можете (если вы пишете классдля объекта)
  • сделать финализацию очень короткой (если вам нужно ее использовать)
  • не выбрасывать такие объекты каждый раз (попробуйте использовать их повторно)

Последний вариант, вероятно, будет лучшим для вас, поскольку вы используете существующую библиотеку.

9 голосов
/ 02 декабря 2011

Из того, что я могу разглядеть, Proxool - это пул соединений для соединений JDBC.Это говорит о том, что проблема в том, что ваше приложение неправильно использует пул соединений.Вместо вызова close для объектов операторов ваш код, вероятно, удаляет их и / или их родительские соединения.Proxool полагается на финализаторы для закрытия базовых объектов, реализованных драйвером ... но для этого нужны экземпляры Finalizer.Это также может означать, что вы заставляете соединение открывать / закрывать (реальные) соединения с базой данных чаще, чем это необходимо, и это ухудшит производительность.

Поэтому я предлагаю вам проверить свой код на утечку ResultSet, Statement и / или Connection объекты, и убедитесь, что вы закрываете их в finally блоках.


Глядя на дамп памяти, я ожидаю, что вы обеспокоены тем, куда идут 898 527 228 байт.Подавляющее большинство остается за объектом Finalizer с идентификатором 2aab07855e38.Если у вас все еще есть файл дампа, посмотрите, на что ссылается Finalizer.Это выглядит более проблематично, чем объекты Proxool.

...