本節(jié)介紹內(nèi)存映射文件,內(nèi)存映射文件不是Java引入的概念,而是操作系統(tǒng)提供的一種功能,大部分操作系統(tǒng)都支持。

我們先來介紹內(nèi)存映射文件的基本概念,它是什么,能解決什么問題,然后我們介紹如何在Java中使用,我們會(huì)設(shè)計(jì)和實(shí)現(xiàn)一個(gè)簡單的、持久化的、跨程序的消息隊(duì)列來演示內(nèi)存映射文件的應(yīng)用。

基本概念

所謂內(nèi)存映射文件,就是將文件映射到內(nèi)存,文件對(duì)應(yīng)于內(nèi)存中的一個(gè)字節(jié)數(shù)組,對(duì)文件的操作變?yōu)閷?duì)這個(gè)字節(jié)數(shù)組的操作,而字節(jié)數(shù)組的操作直接映射到文件上。這種映射可以是映射文件全部區(qū)域,也可以是只映射一部分區(qū)域。

不過,這種映射是操作系統(tǒng)提供的一種假象,文件一般不會(huì)馬上加載到內(nèi)存,操作系統(tǒng)只是記錄下了這回事,當(dāng)實(shí)際發(fā)生讀寫時(shí),才會(huì)按需加載。操作系統(tǒng)一般是按頁加載的,頁可以理解為就是一塊,頁的大小與操作系統(tǒng)和硬件相關(guān),典型的配置可能是4K, 8K等,當(dāng)操作系統(tǒng)發(fā)現(xiàn)讀寫區(qū)域不在內(nèi)存時(shí),就會(huì)加載該區(qū)域?qū)?yīng)的一個(gè)頁到內(nèi)存。

這種按需加載的方式,使得內(nèi)存映射文件可以方便處理非常大的文件,內(nèi)存放不下整個(gè)文件也不要緊,操作系統(tǒng)會(huì)自動(dòng)進(jìn)行處理,將需要的內(nèi)容讀到內(nèi)存,將修改的內(nèi)容保存到硬盤,將不再使用的內(nèi)存釋放。

在應(yīng)用程序?qū)懙臅r(shí)候,它寫的是內(nèi)存中的字節(jié)數(shù)組,這個(gè)內(nèi)容什么時(shí)候同步到文件上呢?這