一 直接内存概述

1)不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。
2)直接内存是在Java堆外的,直接向系统申请的内存空间。
3)来源于NIO,通过存在堆中的 DirectByteBuffer 操作 Native 内存
4)通常,访问直接内存的速度会优于Java堆,即读写性能好

  1. 因此出于性能考虑,读写频繁的场合可能考虑使用直接内存
  2. Java的NIO库允许Java程序使用直接内存,用于数据缓存区
    1. @Test
    2. public void test() {
    3. ByteBuffer byteBuffer = ByteBuffer.allocate(BUFFER);
    4. System.out.println("直接内存分配完毕");
    5. try {
    6. TimeUnit.SECONDS.sleep(10);
    7. } catch (InterruptedException e) {
    8. e.printStackTrace();
    9. }
    10. System.out.println("直接内存开始释放");
    11. byteBuffer = null;
    12. System.gc();
    13. }

    二 设置直接内存

    1)也可能导致OOM异常
    2)由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆内存。但是系统的内存也是有限的,Java堆和直接内存的总和依然是受限于操作系统能给出的最大内存。
    3)缺点:分配回收成本较高,不受JVM内存回收管理。
    4)直接内存大小可以通过参数:-XX:MaxDirectMemorySize设置。
    5)如果不指定,默认与堆的最大值-Xmx参数值一致。