2012-11-16, #1
Nov. 16th, 2012 12:24 amПо наводке из презентации Extreme Performance with Java (сама презентация не очень интересная), посмотрел как реализована очистка native блоков памяти в DirectByteBuffer без использования финалайзеров. Если вкратце, то:
- DirectByteBuffer в конструкторе создает объект типа sun.misc.Cleaner, который наследован от PhantomReference, передавая ему себя и специальный объект типа Deallocator. Т.е. DirectByteBuffer хранит у себя фантомную ссылку на себя же, и когда garbage collector прибирает объект типа DirectByteBuffer, фантомная ссылка попадает в очередь для ReferenceHandler thread
- когда ReferenceHandler thread обрабатывает эту новую ссылку, пришедшую от garbage collector-а, для объектов типа Cleaner срабатывает fast path и вызывается метод clean, который и дергает инстантс класса Deallocator, освобождая native блоки памяти
- DirectByteBuffer в конструкторе создает объект типа sun.misc.Cleaner, который наследован от PhantomReference, передавая ему себя и специальный объект типа Deallocator. Т.е. DirectByteBuffer хранит у себя фантомную ссылку на себя же, и когда garbage collector прибирает объект типа DirectByteBuffer, фантомная ссылка попадает в очередь для ReferenceHandler thread
- когда ReferenceHandler thread обрабатывает эту новую ссылку, пришедшую от garbage collector-а, для объектов типа Cleaner срабатывает fast path и вызывается метод clean, который и дергает инстантс класса Deallocator, освобождая native блоки памяти