JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(四)

⑤. 直接内存(Direct Memory)


  • ①. 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域
  • ②. 直接内存是Java堆外的、直接向系统申请的内存区间
  • ③. 代码演示:


/**
 *  IO                  NIO (New IO / Non-Blocking IO)
 *  byte[] / char[]     Buffer
 *  Stream              Channel
 *
 * 查看直接内存的占用与释放
 */
public class BufferTest {
    private static final int BUFFER = 1024 * 1024 * 1024;//1GB

    public static void main(String[] args){
        //直接分配本地内存空间
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);
        System.out.println("直接内存分配完毕,请求指示!");

        Scanner scanner = new Scanner(System.in);
        scanner.next();

        System.out.println("直接内存开始释放!");
        byteBuffer = null;
        System.gc();
        scanner.next();
    }
}


④. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存


JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(四)


JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(四)


⑤. 通常,访问直接内存的速度会优于Java堆。即读写性能高


⑥. 直接内存大小可以通过MaxDirectMemorySize设置,如果不指定,默认与堆的最大值一Xmx参数值一致


⑦. 简单理解: java process memory = java heap + native memory


JVM07_ 对象的实例化、内存布局(对象头、实例数据、对齐填充)、访问定位、直接内存(四)



上一篇:centos7安装配置docker


下一篇:SAP ABAP操作Office Excel的开源项目abap2xlsx