Direct vs non-direct ByteBuffer
先解释一下两者的区别: Non-direct ByteBuffer 内存是分配在堆上的,直接由 Java 虚拟机负责垃圾收集,你可以把它想象成一个字节数组的包装类,如下伪码所示: HeapByteBuffer extends ByteBuffer { byte[] content; int position, limit, capacity; ...... } 而 Direct ByteBuffer 是通过 JNI 在 Java 虚拟机外的内存中分配了一块(所以即使在运行时通过 -Xmx 指定了 Java 虚拟机的最大堆内存,还是 可能 实例化超出该大小的 Direct ByteBuffer ),该内存块并不直接由 Java 虚拟机负责垃圾收集,但是在 Direct ByteBuffer 包装类被回收时,会通过 Java Reference 机制来释放该内存块。如下伪码所示: DirectByteBuffer extends ByteBuffer { long address; int position, limit, capacity; protected void finalize() throws Throwable{ // 释放内存块,该段代码仅仅用于演示,真正的 Direct ByteBuffer 并不是通过 finalize 来释放的 releaseAddress();