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