开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段):存储文件内存映射-TransientStorePool】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/704/detail/12482
存储文件内存映射-TransientStorePool
内容介绍:
一.TransientStorePool
二.重要属性
三.初始化
一.TransientStorePool
TransientStorePool 这个类其实就是堆外内存的缓存池,这个堆外内存主要用来存放临时的数据,如果开启了内存,数据首先会写入到堆外内存中,再通过 commit 定时线程将数据复制到与目标物理文件对应的内存映射中。RocketMQ 引入该机制主要的原因是提供一种内存锁定,让内存一直被RocketMQ 占用,不会被交换至磁盘中。
二.重要属性
1.private final int poolSize;
// availableBuffers 个数
2. private final int fileSize;
//每个ByteBuffer大小
3. private final Deque<ByteBuffer> availableBuffers;
// ByteBuffer容器,双端队列
这里面有些重要的属性,一个是缓存池的大小,每一个缓存池的文件每一个缓存池区域的大小。还有一个存放的队列的容器,专门存放堆外缓存区的对象。
三.初始化
public void init() {
//创建 poolSize 个堆外内存
for (int i = 0; i < poolSize; i++){
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(fileSize);
final long address = ((DirectBuffer) byteBuffer). address();
Pointer pointer = new Pointer(address);
//使用 com.sun.jna.Library 类库将该批内存锁定,避免被置换到交换区,提高存储性能
LibC.INSTANCE.mlock(pointer,new NativeLong(fileSize));
availableBuffers.offer(byteBuffer);
}
}
这是初始化的一个方法,该方法也很简单,就是定义当前的 poolSize,然后创建每一个堆外的内存,然后都放到对应的容器中去。