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 阅读 58 次 更新于 2025-10-29 20:00:43 我来答关注问题0
  •  阿暄生活 java的nio是什么

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

  •  翡希信息咨询 nio是什么意思?

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

  •  阿暄生活 什么事nio

    NIO主要用于Java编程语言,在Java 1.4中首次引入。它特别适用于需要高并发处理的网络应用程序,如服务器端开发,尤其是需要处理大量并发连接的应用场景。3. 关键特性:非阻塞通道:NIO使用通道(Channel)和缓冲区(Buffer)进行数据传输,通道可以是非阻塞的,这意味着程序可以在通道等待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...

  •  翡希信息咨询 一文详解IO模型中BIO/NIO/AIO

    一文详解IO模型中的BIO/NIO/AIOIO(输入输出)是指数据从外设(磁盘、网络设备)输入到内存的过程,以及将内存中的数据输出到外设的过程。系统用什么样的通信模式进行数据的传输和接收,很大程度上决定了程序通信的性能。Java共支持3种网络编程的IO模型:BIO、NIO、AIO。下面将详细解释这三种IO模型。同步...

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

编程相关话题

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