heimamq源码再读-02

视频:https://www.bilibili.com/video/BV1dt41147JS?from=search&seid=5974336792410216241

带注释的源码:

heimamq源码再读-02

以两个比赛的试题为引子:

heimamq源码再读-02

heimamq源码再读-02

---

heimamq源码再读-02

---

往映射文件写消息再刷到commitLog。

heimamq源码再读-02

MappedFileQueue。

mappedFiles是一个copyOnWriteList。

heimamq源码再读-02

heimamq源码再读-02

heimamq源码再读-02

heimamq源码再读-02

countDownLatch只需要等待第一个文件创建完成的。

仅仅需要创建一个但是下一个也创建了。

heimamq源码再读-02

点进去:

heimamq源码再读-02

heimamq源码再读-02

heimamq源码再读-02

这个是如何获取的:就是在broker服务端启动的时候初始化的流程调用的。

heimamq源码再读-02

heimamq源码再读-02

---

heimamq源码再读-02

heimamq源码再读-02

---

看下代码:

heimamq源码再读-02

heimamq源码再读-02

这里:必须要求服务线程不为空才创建的:

heimamq源码再读-02

为什么呢?

heimamq源码再读-02

heimamq源码再读-02

在这里传进来的。

这里初始化的:

heimamq源码再读-02

接着:

heimamq源码再读-02

这个就是放一个请求然后返回一个映射文件:

heimamq源码再读-02

映射文件的创建是有两种方式的:

heimamq源码再读-02

看下堆外内存池:

heimamq源码再读-02

默认是5个拿走一个少一个。

heimamq源码再读-02

在这里等待服务的创建:

heimamq源码再读-02

heimamq源码再读-02

heimamq源码再读-02

heimamq源码再读-02

这个文件就是一个map结构,其中的key就是文件的路径。

heimamq源码再读-02

继续往下:

heimamq源码再读-02

heimamq源码再读-02

heimamq源码再读-02

heimamq源码再读-02

唤醒等待的线程。

---

heimamq源码再读-02

下面我们看下这里:

heimamq源码再读-02

关于预热:

heimamq源码再读-02对物理内存映射之后,这个只是虚拟的内存地址,并没有对应真正的物理内存。

查询的话会缺页,再从磁盘读数据,提高效率可以加预热。放在物理内存和虚拟内存映射。

为什么预热写入假值。

heimamq源码再读-02

可能被回收的。

heimamq源码再读-02锁定不被回收,锁死了。

heimamq源码再读-02

---

heimamq源码再读-02

拷贝到socketBuffer作为连续的内存地址。

heimamq源码再读-02

heimamq源码再读-02

wrotePosition:写到哪个位置。

heimamq源码再读-02

committedPosition:写道fileChannel写到了哪里。

flushedPosition:刷盘刷到哪里。

---

heimamq源码再读-02

heimamq源码再读-02

heimamq源码再读-02