У меня есть программа Java, которая продолжает вызывать java.util.zip
для сжатия / распаковки данных. Память заканчивается в течение нескольких секунд. У меня был дамп памяти с jmap
и смотрю с jhat
.
Сводка финализатора показывает Total instances pending finalization: 0
. Если я правильно понимаю, у меня нет объектов, которые (1) имеют метод finalize (), (2) были отмечены GC и (3) ожидают завершения. Кажется, это хорошо.
Когда я смотрю на конкретный объект, единственная ссылка на этот объект - java.lang.ref.Finalizer
. Объект Finalizer создается для каждого объекта, у которого есть метод finalize (), независимо от того, является ли объект сборщиком мусора или нет. Похоже, ничто не мешает этому Deflater
объекту быть GC'ed.
Объект по адресу 0x7f4aeb7a35d0
экземпляр java.util.zip.Deflater@0x7f4aeb7a35d0 (51 байт)
Ссылки на этот объект:
java.lang.ref.Finalizer@0x7f4aeb8607c8 (64 байта): референт поля
Программа приостановлена на System.in.read()
. Использование памяти не снижается через некоторое время.
ОБНОВИТЬ:
Я должен прояснить это. Дамп памяти показывает, что многие объекты не были объединены в сборку мусора, но никакие другие объекты (кроме объектов Finalizer) не ссылались на них. Я пытаюсь выяснить, почему они не были внесены в сборку мусора.
Show all members of the rootset
показывает только 1 ссылку на класс Deflater, но не на экземпляры. - person woodings   schedule 21.11.2012