2010-04-05 175 views
1

我正在看Java中的一些內存映射文件。假設我有一個堆大小設置爲2GB,我的內存映射一個50GB的文件 - 遠遠超過機器上的物理內存。操作系統會將該50GB文件的一部分緩存在os文件緩存中,java進程將擁有2GB的堆空間。我很好奇的是操作系統如何決定要緩存多少50GB文件?例如,如果我有另一個java進程,也有一個2gb堆大小,將2gb換出來允許os緩存部分內存映射文件嗎?第一個進程的堆空間部分是否會被換出以允許操作系統緩存?Java內存映射文件和交換

有什麼辦法可以告訴操作系統不要交換操作系統緩存的堆空間嗎?如果操作系統沒有交換出主進程,它如何確定文件緩存應該有多大?

回答

2

Linux並沒有真正區分匿名和內存映射頁面。無論如何,它們都會通過頁面錯誤獲得需求負載。

您可以將匿名內存視爲/ dev/zero的私有內存映射。

因此,您可以根據需要映射儘可能多的任何東西(地址空間允許,但我假設您位於64位盒中)。 Linux只在進程通過頁面錯誤觸及它們時才加載它們。

同樣,它保留了最近頁面的使用情況的一些記錄,因此它們被優先處理以便被丟棄。

如果你的文件映射是MAP_SHARED,唯一的區別是爲了獲得更多空間用於其他事情而丟棄的頁面不必寫入交換區域,它們可以從原始文件。

因此,在回答您的問題時,如果您不讀取或寫入頁面,映射大型文件不會將任何人的虛擬內存帶走。