Java网络编程与NIO详解8:浅析mmap和Direct Buffer

mmap是内存映射文件的方法,将文件或其他对象映射到进程的地址空间,实现文件磁盘地址与进程虚拟地址空间中一段虚拟地址的一一对应关系。进程通过指针读写这段内存,系统自动回写脏页面到对应的文件磁盘上,无需调用read,write等系统调用函数。内核空间的修改也直接反映在用户空间,支持进程间文件共享。内存映射...
Java网络编程与NIO详解8:浅析mmap和Direct Buffer
mmap基础概念

mmap是内存映射文件的方法,将文件或其他对象映射到进程的地址空间,实现文件磁盘地址与进程虚拟地址空间中一段虚拟地址的一一对应关系。进程通过指针读写这段内存,系统自动回写脏页面到对应的文件磁盘上,无需调用read,write等系统调用函数。内核空间的修改也直接反映在用户空间,支持进程间文件共享。

内存映射原理

mmap内存映射分为三个阶段:创建虚拟区域、实现文件物理地址与虚拟地址映射、访问引发缺页异常完成文件内容到物理内存的拷贝。

mmap与常规文件操作的区别

mmap在创建虚拟区域与建立映射阶段无需文件拷贝,仅在访问时引发缺页异常一次数据拷贝,从磁盘到用户主存,提高文件读取效率与用户空间和内核空间的交互效率。

mmap优点总结

1. 提高文件读取效率,减少数据拷贝次数。
2. 实现高效的数据直接交互,用户空间与内核空间的修改可即时反映。
3. 支持进程间共享内存和通信,进程间可以修改映射区域。
4. 适用于大规模数据传输,避免内存不足问题。

mmap使用细节

1. 映射区域大小需为物理页大小的整数倍。
2. 可合法访问映射区域内的数据,不论文件大小变化。
3. 映射后,文件关闭时映射依然存在,不受文件句柄限制。

堆外内存

堆外内存是JVM管控之外的内存区域,DirectByteBuffer通过虚引用实现堆外内存的释放。

DirectByteBuffer

DirectByteBuffer实现堆外内存的创建、使用和销毁,通过native方法分配堆外内存,提供操作堆外内存的接口。

堆外内存的创建与回收

Bits.reserveMemory方法尝试分配堆外内存,通过System.gc()触发full gc释放内存资源,保证堆外内存的可用性。

堆外内存回收

Cleaner维护堆外内存的释放,当DirectByteBuffer对象被GC回收时,Cleaner链表中的Cleaner对象被移除,从而触发堆外内存的释放。

配置参数

通过-XX:MaxDirectMemorySize配置最大堆外内存大小,达到阈值时触发full gc回收未使用的堆外内存。

堆外内存使用场景

适用于大型数据传输、高性能内存操作等需求,避免内存限制问题。

堆外内存特点

高效、灵活的内存管理,支持直接内存操作,减少内存复制。

堆外内存问题

内存管理不当可能导致内存泄漏,使用需谨慎。

参考文章

http://lovestblog.cn/blog/2015/05/12/direct-buffer/
http://www.infoq.com/cn/news/2014/12/external-memory-heap-memory
http://www.jianshu.com/p/85e931636f27圣思园《并发与Netty》课程2024-08-21
mengvlog 阅读 34 次 更新于 2025-08-06 21:04:15 我来答关注问题0
  •  翡希信息咨询 nio是什么意思?

    Nio是Nonblocking I/O的缩写,意为非阻塞I/O。以下是对Nio的详细解释:非阻塞I/O概念:Nio是一种I/O操作模式,在这种模式下,线程发起I/O请求后,无需等待操作完成即可继续执行其他任务。当I/O操作完成后,系统会通知线程进行处理。与传统I/O对比:传统的阻塞I/O模式中,线程发起I/O请求后必须等...

  •  阿暄生活 java的nio是什么

    java.nio.channels.FileChannel:NIO中的文件通道,用于文件I/O操作。四、总结 Java的NIO是现代Java网络编程的重要部分,特别是在需要处理大量并发连接的场景中。通过提供通道、缓冲区和选择器等组件,NIO解决了传统I/O模型中的阻塞问题,提升了性能并增强了并发处理能力。

  •  深空见闻 nio是什么元素

    NIO(Non-Blocking I/O,非阻塞I/O)并不是一种化学元素,而是一种编程模型,用于提高I/O操作的性能。以下是关于NIO的详细解释:1. NIO的定义 NIO是Java编程语言中引入的一种新的I/O处理机制,旨在提高I/O操作的效率和性能。它首次在Java 1.4版本中引入,为开发人员提供了一种更高效的处理I/O...

  •  宜美生活妙招 nio 是什么公司

    Nio不是一家公司,而是Java中的一个包。以下是关于Nio的详细解释:Nio的全称和功能:Nio全称为New I/O,是Java标准库中的一个重要部分。它提供非阻塞I/O操作的一组接口和实现,能够在单一线程中处理多个通道和数据流,特别适合于需要高性能、高可扩展性和高吞吐量的应用程序。Nio的特点:Nio提供了多...

  •  文暄生活科普 10分钟看懂,Java NIO 底层原理

    1.1.2 java IO读写的底层流程用户程序通过系统调用read&write进行IO操作,数据在内核缓冲区与进程缓冲区之间传输。典型Java服务端处理网络请求的流程包括:客户端请求、获取请求数据、服务器端业务处理、构建响应数据、发送给客户端。1.2 四种主要的IO模型服务器端编程常需构建高性能IO模型,常见的有四种...

檬味博客在线解答立即免费咨询

编程相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部