2017-02-06 41 views
0

在運行 「自由」 命令,我看到使用的存儲器是:
總數:3854884
使用:3752304
自由:102580
共享:352個
緩衝器:9252
緩存:150908當沒有交換空間時,虛擬內存如何存在?

-/+緩衝區/緩存: 使用:3592144
免費:262740

Swap: 0 0 0

但是在運行htop時,我發現在VIRT列(虛擬內存)下有很多使用4507M內存量的進程。 RES列(物理RAM進程正在使用)顯示209M。 SHR(共享內存)是5352M。

-Xmx該過程配置爲2048m

如果交換空間爲零,如何使用虛擬內存?

+0

將內存映射文件包含在'VIRT'中嗎? – Thilo

回答

3

這些程序(htop等)正在計算的虛擬內存只是進程請求的地址空間的大小。您擁有物理內存,實際RAM和一個虛擬地址空間,它們在用戶空間程序將它們視爲物理內存時映射地址。他們是分開的。一個0x0ff84560指針可能實際上並不引用該部分RAM。操作系統可以設置一個映射來決定你實際引用的RAM的位置。甚至更進一步,它可以在它有內存備份之前設置映射。這是一個事件驅動的過程。操作系統會根據請求設置映射,但沒有實際的支持,沒有分配物理內存,只有在嘗試使用虛擬內存時纔將其映射到真實的RAM。

虛擬內存的大小就是這個映射的大小。但並非所有的內存都需要物理內存,所以即使沒有交換,內存也可能大於內存。但是這導致問題程序嘗試實際使用使用以上的內存比有內存。如果他們僅僅請求它,那麼它就沒有問題,只有當他們使用它時。

此外,正如Thilo提到的,內存映射文件可以添加到此。您可以將整個100TB文件映射到您的虛擬地址空間中,沒有任何問題。操作系統在後臺處理物流:將需要的部分(您試圖訪問的部分)引入,並收集必要的部分以清除物理內存。

+0

因此,htop向我展示了程序請求4GB的虛擬內存,但是由於交換空間爲0,它不會得到這個結果嗎?這解釋了崩潰。 – Nav

+0

這不僅是因爲交換空間是0.內存映射文件使這一點更復雜。如果你的內存映射一個100GB的文件,操作系統可能會使它工作,但它會很慢,因爲它必須經常清理一些東西並且帶來新東西,這就需要暫停你的程序。 – Tyler

+0

這取決於程序請求的虛擬內存的類型,基本上。 – Tyler