1. 介绍

在很多JAVA实现的产品中我们都可以看到JVM的off heap内存空间的使用。例如kafka、ignite、alluxio等等。这说明OS管理内存是有好处的,例如可以利用os page cache来改进IO性能。

今天看到一篇PPT似乎不错,打算学习下。PPT原文见:On heap cache vs off-heap cache

2. heap上对象的开销

3. JAVA中分配堆外空间的方法

3.1 java.nio.ByteBuffer

  1. DirectByteBuffer (off-heap, up to 2gb)
  2. MappedByteBuffer (off-heap, up to 2gb, persisted)


可以通过-XX:MaxDirectMemorySize来设置

3.2 sun.misc.Unsafe

public native long allocateMemory(long allocationSizeInBytes);

4. 堆外存储好处

4.1 优点

  1. 不会发生GC
  2. 可以利用os page cache,读写性能更好
  3. 适合做数据持久化

4.2 缺点

1.堆外内存泄漏

5. 学习资料

  1. JVM源码分析之不可控的堆外内存
  2. Mycat-BigMemoryAPI
  3. Java Support for Large Memory Pages

PS: 寒泉子好多文章都很好,建议多读