Утечка памяти? почему java.lang.ref.Finalizer есть столько памяти
Я запустил кучу кучи в своей программе. Когда я открыл его в инструменте анализатора памяти, я обнаружил, что java.lang.ref.Finalizer
для org.logicalcobwebs.proxool.ProxyStatement
занимает много памяти. Почему это так?
![screenshot]()
Ответы
Ответ 1
Некоторые классы реализуют метод Object.finalize()
. Объекты, которые переопределяют этот метод, должны вызываться финализатором фонового потока, и они не могут быть очищены до тех пор, пока это не произойдет. Если эти задачи короткие, и вы не отказываетесь от многих из них, все работает хорошо. Однако, если вы создаете много этих объектов и/или их финализаторы занимают много времени, очередь объектов, которые будут завершены, накапливается. Эта очередь может использовать всю память.
Решение
- не используйте объекты finalize() d, если вы можете (если вы пишете класс для объекта)
- сделать очень короткий (если вам нужно его использовать)
- не отбрасывайте такие объекты каждый раз (попробуйте повторно их использовать)
Последний вариант, вероятно, будет лучше для вас, поскольку вы используете существующую библиотеку.
Ответ 2
Из того, что я могу разобрать, Proxool - это пул соединений для соединений JDBC. Это говорит о том, что проблема заключается в том, что ваше приложение неправильно использует пул соединений. Вместо вызова close
в объектах оператора ваш код, вероятно, отбрасывает их и/или их родительские соединения. Proxool полагается на финализаторы, чтобы закрыть базовые объекты, реализованные с помощью драйвера... но для этого требуются экземпляры Finalizer. Это также может означать, что вы заставляете соединение открывать/закрывать (реальные) соединения с базой данных чаще, чем это необходимо, и это было бы плохо для производительности.
Поэтому я предлагаю вам проверить свой код на пропущенные объекты ResultSet, Statement и/или Connection и убедиться, что вы закрываете их в блоках finally
.
Глядя на дамп памяти, я ожидаю, что вас беспокоит, куда идут 898 527 228 байт. Подавляющее большинство сохраняются объектом Finalizer, id которого 2aab07855e38
. Если у вас все еще есть файл дампа, посмотрите, что означает Finalizer
. Это выглядит более проблематичным, чем объекты Proxool.