看了不少资料,总结下:
堆外内存 / 直接内存(Direct Memory)
JDK1.4中引入的NIO类,基于channel和Buffer的I/O方式,可用Native库直接分配堆外内存,然后利用一个存储在堆中的DirectByteBuffer对象作为这块内存引用来操作。避免了在Java堆和Native堆中来回复制数据。
优点
1.堆外内存不影响 JVM GC,程序会减少 Full GC。
2 IO 操作使用堆外内存比堆内存快。因为堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;直接移到堆外就更快了
缺点
1 堆外内存难以控制,如果内存泄漏,那么很难排查
2 堆外内存只能通过序列化和反序列化来存储,保存对象速度比堆内存慢,不适合存储很复杂的对象。一般简单的对象或者扁平化的比较适合。
常用场景
通常用在通信过程中做缓冲池,在mina,netty等nio框架中屡见不鲜
创建
堆外内存可以通过 java.nio.DirectByteBuffer 来创建,调用 allocateDirect 方法申请即可。
API:http://docs.oracle.com/javase/8/docs/api/
其他:
另外,默认的情况下堆外内存是有一定的限制的(待定);
可以通过设置-XX:MaxDirectMemorySize=10M控制堆外内存的大小:
相关资料: