直接内存的回收机制

对外内存
堆外内存是相对于堆内内存的一个概念,堆内内存是由JVM所掌控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且他们遵 循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存,那么堆外内存就是存在于JVM管控之外的一块内存区域,因此,它不直接虚拟机被管控。
直接内存
NIO的Buffer提供了一个可以不经过JVM内存直接访问系统物理内存的类——DirectBuffer。 DirectBuffer类继承自ByteBuffer,但和普通的ByteBuffer不同,普通的ByteBuffer仍在JVM堆上分配内存,其最大内存受到最大堆内存的限制;而DirectBuffer直接分配在物理内存中,并不占用堆空间,其可申请的最大内存受操作系统限制

直接内存的回收原理

使用了unsafe对象完成直接内存的分配回收,并且回收需要主动调用freememory方法。
bytebuffer的实现类的内部,使用了cleaner来检测bytebuffer对象,一旦bytebuffer对象被垃圾回收,那么就会由referencehandler线程通过cleaner的clean方法调用freemermory来释放直接内存

Guess you like

Origin blog.csdn.net/nice_good_boy/article/details/120839837