視頻:https://www.bilibili.com/video/BV1dt41147JS?from=search&seid=5974336792410216241
帶註釋的源碼:
以兩個比賽的試題爲引子:
---
---
往映射文件寫消息再刷到commitLog。
MappedFileQueue。
mappedFiles是一個copyOnWriteList。
countDownLatch只需要等待第一個文件創建完成的。
僅僅需要創建一個但是下一個也創建了。
點進去:
這個是如何獲取的:就是在broker服務端啓動的時候初始化的流程調用的。
---
---
看下代碼:
這裏:必須要求服務線程不爲空才創建的:
爲什麼呢?
在這裏傳進來的。
這裏初始化的:
接着:
這個就是放一個請求然後返回一個映射文件:
映射文件的創建是有兩種方式的:
看下堆外內存池:
默認是5個拿走一個少一個。
在這裏等待服務的創建:
這個文件就是一個map結構,其中的key就是文件的路徑。
繼續往下:
喚醒等待的線程。
---
下面我們看下這裏:
關於預熱:
對物理內存映射之後,這個只是虛擬的內存地址,並沒有對應真正的物理內存。
查詢的話會缺頁,再從磁盤讀數據,提高效率可以加預熱。放在物理內存和虛擬內存映射。
爲什麼預熱寫入假值。
可能被回收的。
鎖定不被回收,鎖死了。
---
拷貝到socketBuffer作爲連續的內存地址。
wrotePosition:寫到哪個位置。
committedPosition:寫道fileChannel寫到了哪裏。
flushedPosition:刷盤刷到哪裏。
---