mq内存映射

Posted lccsblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mq内存映射相关的知识,希望对你有一定的参考价值。

MappedFileQueue的封装

MappedFileQueue是MappedFile的管理容器,MappedFileQueue是对存储目录的封装。

技术图片

 

查找MappedFile:

1.根据时间戳来查找MappedFile:

技术图片

 

2.根据消息偏移量offset查找MappedFile

 

 

技术图片

 

mq采用定时删除策略,不定时的将已消费的消息从存储文件中删除,会造成极大的内存压力与资源浪费,也就是说在存储文件中,第一个文件不一定是0000...因为该文件在某一时刻会被删除。

参考下面3个方法理解:

 

技术图片

 

 

 

技术图片

 技术图片

 内存映射文件MappedFile

 

 

 

技术图片

 

wirteBuffer:堆内存ByteBuffer,如果不为空,数据首先将存储在该Buffer中,然后提交到MappedFile对应的内存映射文件Buffer。transientStorePoolEnable为true时不为空

transientStorePool:堆内存池,transientStorePoolEnable为true时启用。

fileFromOffset:该文件的初始偏移量

mappedByteBuffer:物理文件对应的内存映射Buffer。

MappedFile初始化:

1.transientStorePoolEnable为true表示内容先存储在堆外内存,然后通过commit线程将数据提交到内存映射Buffer中,再通过Flush线程将内存映射Buffer中的数据持久化到磁盘。

技术图片

 

 

技术图片

 

 

 

技术图片

 

 

 

技术图片

 

 

 

技术图片

 

 

刷盘:

是不是少了FileChannel怎么到内存映射Buffer的???

 技术图片

 获取MappedFile最大读指针:

 

 

技术图片

 

 

 

技术图片

 

MappedFile销毁:

 

 

技术图片

 

技术图片

 

 

技术图片

 

 

 

技术图片

 

 

 

技术图片

 

 

 

技术图片

以上是关于mq内存映射的主要内容,如果未能解决你的问题,请参考以下文章

内存映射:小块内存申请brk和申请大块内存的Mmap分析

内存映射mmap 和 共享内存

Linux 内核 内存管理内存管理系统调用 ① ( mmap 创建内存映射 | munmap 删除内存映射 | mprotect 设置虚拟内存区域访问权限 )

内存映射阅读器找不到全局内存映射对象

Linux 内核 内存管理内存映射相关数据结构 ⑥ ( 文件映射 虚拟内存区域 | vm_area_struct | vm_operations_struct | 匿名映射 虚拟内存区域 )

高效率场景-内存映射