使用

ByteBuffer.allocateDirect
Unsafe.allocateMemory

好处

  1. 堆外内存由操作系统管理,减少GC工作量。
  2. 网络IO(到网卡),文件IO(到磁盘)时,减少一次内存拷贝(用户态 -> 内核态)。

回收

创建DirectByteBuffer对象的同时会创建Cleaner。
Cleaner是的clean方法提供了堆外内存的释放操作。Cleaner是虚引用,也就是DirectByteBuffer被GC之后,会触发Cleaner的clean方法进行释放堆外内存。
堆外内存的缺点就是内存难以控制,使用了堆外内存就间接失去了JVM管理内存的可行性,改由自己来管理,当发生内存溢出时排查起来非常困难。