mmap是内存映射文件的方法,将文件或其他对象映射到进程的地址空间,实现文件磁盘地址与进程虚拟地址空间中一段虚拟地址的一一对应关系。进程通过指针读写这段内存,系统自动回写脏页面到对应的文件磁盘上,无需调用read,write等系统调用函数。内核空间的修改也直接反映在用户空间,支持进程间文件共享。内存映射...
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-memoryhttp://www.jianshu.com/p/85e931636f27圣思园《并发与Netty》课程2024-08-21