万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • 大纲

  • 走近Java

  • 内存与垃圾回收

    • JVM内存结构图
    • 类加载子系统
    • 运行时数据区
    • 程序计数器(PC寄存器)
    • 虚拟机栈
    • 本地方法栈
    • 堆
    • 方法区
    • 对象的实例化
    • 直接内存
      • 概述
      • 非直接缓存区
      • 直接缓存区
      • 注意事项
    • 执行引擎
    • String Table
    • 垃圾回收概述
    • 垃圾回收相关概念
    • 垃圾回收算法
    • 垃圾收集器
    • 对象访问
    • 栈帧结构
  • 字节码与类加载

  • 性能监控与调优

  • 监控与性能调优案例

  • Java虚拟机
  • 内存与垃圾回收
2022-03-01
目录

直接内存

# 直接内存

# 概述

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

  • 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。

  • Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。

# 非直接缓存区

使用IO读写文件,需要与磁盘交互,需要由用户态切换到内核态。

在内核态时,需要两份内存存储重复数据,效率低。

direct_memory_1

# 直接缓存区

使用NIO时,操作系统划出的直接缓存区可以被Java代码直接访问,只有一份。

NIO适合对大文件的读写操作。

direct_memory_2

# 注意事项

  1. 使用直接内存也可能导致OutOfMemoryError异常。

    Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory 
        at java.nio.Bits.reserveMemory(Bits.java:693)
        at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
        at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
        at com.atguigu.java.BufferTest2.main(BufferTest2.java:20)
    
  2. 由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。

  3. 缺点

    • 分配回收成本较高
    • 不受JVM内存回收管理
  4. 直接内存大小可以通过MaxDirectMemorySize设置,如果不指定,默认与堆的最大值-Xmx参数值一致。

    direct_memory_3

上次更新: 5/28/2023, 10:57:53 PM
执行引擎

执行引擎→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式