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 阅读 11 次 更新于 2025-06-20 01:06:30 我来答关注问题0
  • mmap是内存映射文件的方法,将文件或其他对象映射到进程的地址空间,实现文件磁盘地址与进程虚拟地址空间中一段虚拟地址的一一对应关系。进程通过指针读写这段内存,系统自动回写脏页面到对应的文件磁盘上,无需调用read,write等系统调用函数。内核空间的修改也直接反映在用户空间,支持进程间文件共享。内存映射...

  •  深空见闻 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网络编程详解之Selector事件选择器

    NIO网络编程中的Selector事件选择器详解如下:基本概念:Selector:提供了选择性执行已就绪任务的能力,实现了多路I/O,使得单线程能够有效管理多个I/O通道。SelectableChannel:可通过Selector管理的Channel类型。SelectionKey:封装了特定Channel与Selector的注册关系,包含感兴趣的事件集合和就绪事件集合。Selecto...

  •  武汉誉祥科技 nio 是什么公司

    Nio是Java编程语言中的一个包,全称为New I/O,是Java标准库中的一个重要部分。它不是一家公司或组织,而是用于提供非阻塞I/O操作的一组接口和实现。这个包特别适合于需要高性能、高可扩展性和高吞吐量的应用程序。通过Nio,开发者能够更有效地处理大量的并发连接和数据传输。以下是关于Nio的详细解释...

  •  文暄生活科普 nio是什么意思?

    此外,由于其高效的并发处理能力,Nio在大数据处理、实时通信等领域有广泛应用。总之,Nio是一种非阻塞的I/O操作模式,通过允许线程在等待I/O操作完成时执行其他任务,提高了系统的并发性能和响应能力。在Java中,Nio是一套用于非阻塞I/O操作的API,广泛应用于网络编程和文件操作等领域。

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

编程相关话题

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