Java 堆外内存

堆外内存是相对于堆内内存的一个概念。

堆内内存

Java虚拟机中运行时数据区中的内存,用于存储Java实例对象

堆内内存是受Java虚拟机的管控的,内存的分配和释放都是基于Java虚拟机的内存管理机制。

常用的垃圾回收方式:分代回收

常用的垃圾回收算法:CMSG1.

堆外内存

堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,直接使用系统内存,不受虚拟机内存管理的控制。

优势

  • 提高垃圾回收速度:垃圾回收不会处理堆外内存;
  • 加快了复制的速度,与直接内存的复制相比,堆内数据同样需要复制到直接内存(堆外内存 -> 堆外内存)。

堆内内存由JVM管理,属于用户态堆外内存由系统管理,属于内核态

JVM的数据写入操作首先会把数据写入到堆内内存,然后再复制到对外内存
如果直接把数据写入对外内存的话,就避免了用户态到内核台的复制

缺点

  • 堆外内存难以控制:由于堆外内存不受虚拟机控制,内存的管理是开发者决定的,如果出现内存泄露不好排查;
  • 对象存储效率低(序列化问题):对外内存要求必须以字节数组方式存储,因此对象必须在存储过程中进行序列化/反序列化操作,效率较低。

使用场景

  • 生命周期较长的对象,例如,应用预加载的常驻内存的数据;
  • 直接的文件拷贝或IO操作,例如,NIO框架中使用方式;