Подтвердить что ты не робот

Утечка памяти? почему java.lang.ref.Finalizer есть столько памяти

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

screenshot

4b9b3361

Ответ 1

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

Решение

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

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

Ответ 2

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

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


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