Java中的内存分为两个部分,一部分是不需要jvm管理的直接内存,也被称为堆外内存。堆外内存就是把内存对象分配在JVM堆意外的内存区域,这部分内存不是虚拟机管理,而是由操作系统来管理,这样可以减少垃圾回收对应用程序的影响。
使用
通过NIO中的allocateDirect这样的API可以Java堆外分配内存空间。然后通过Java虚拟机里面的DirectByteBuffer可以引用和操作这些堆外内存空间。
好处
使用堆外内存的好处是,可以提升性能。比如常规情况下,把java堆内部的数据进行远程发送,需要先把堆内部的数据拷贝到直接内存里面,也就是拷贝到堆外内存,然后在发送。如果把对象分配到直接内存里面,发送的时候就可以省掉复制的哪一步操作。
缺点
缺点就是没有jvm帮助管理内存,需要我们自己来管理堆外内存,防止内存溢出。为了避免一直没有FULL GC,最终导致物理内存被耗完。我们会指定直接内存的最大值,通过-XX:MaxDirectMemerySize来指定,当达到阈值的时候,调用system.gc来进行一次full gc,把那些没有被使用的直接内存回收掉。