JVM - 堆外内存

看了不少资料,总结下:

堆外内存 / 直接内存(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控制堆外内存的大小:

 

相关资料:

  《Java堆外内存之突破JVM枷锁

  《JVM源码分析之堆外内存完全解读

  《java 内存移到堆外!!! Jvm gcih 淘宝优化JVM实践

  《一个失败的java堆外缓存库

posted @ 2016-04-27 19:05  互联网隐者  阅读(1370)  评论(0编辑  收藏  举报