В Sun JDK a java.nio.DirectByteBuffer
- созданный ByteBuffer#allocateDirect(int)
- имеет поле типа sun.misc.Cleaner
, которое расширяется java.lang.ref.PhantomReference
.
Когда этот Cleaner
(помните, подтип PhantomReference
) собирается и собирается переместиться в связанный ReferenceQueue
, связанный с коллекцией поток, проходящий через вложенный тип ReferenceHandler
, имеет специальный регистр обработкиCleaner
экземпляров: он преуменьшает значение и вызывает Cleaner#clean()
, что в конечном итоге возвращается к вызову DirectByteBuffer$Deallocator#run()
, который, в свою очередь, вызывает Unsafe#freeMemory(long)
.Вау.
Это довольно круто, и я был удивлен, не увидев никакого использования Object#finalize()
в игре.У разработчиков Sun, должно быть, были причины связать это еще ближе с подсистемой управления сбором и ссылками.
Короче говоря, вам не хватит памяти из-за отказа от ссылок на экземпляры DirectByteBuffer
,до тех пор, пока сборщик мусора сможет заметить отказ и его поток обработки ссылок будет проходить через вызовы, описанные выше.