2013-04-15 78 views
3

我想了解JVMGC與內存分頁之間的collaboration。我有一個linux框,其中有4GB RAM並分配了1.2GB for JVM。如果我運行需要大量內存的應用程序,我想知道何時發生內存分頁以及何時實際上出現內存不足錯誤throws。當一個對象被創建時,它會在堆上創建,如果它沒有被使用,它將被垃圾收集,如果它被應用程序使用,它將被收集。垃圾回收+內存分頁

所以我的問題是什麼時候操作系統啓動內存分頁JVM以及OS分頁的活動對象會發生什麼?

而且,如果操作系統頁面生活的Java對象,它如何優先哪個對象應該首先被分頁?它是否會佔用佔用大部分內存的對象?

回答

1

首先內存分頁由底層操作系統處理,而不是由JVM處理。

如果你的意思是去碎片,那麼是的JVM爲你做。 This可以更加深入地瞭解垃圾收集器如何處理垃圾收集器,該收集器可將長壽命的物體轉移到不同的世代,從而在旅途中消除碎片。這顯然影響哪些對象被分頁/不分頁。但是,這是最大的間接控制(通過延長或縮短物體的壽命)

而根據內存堆,純粹是當沒有剩餘空間時。

+0

感謝您的回覆。我知道操作系統處理分頁,GC通過將對象從YG移動到OG來處理內存管理。我的問題是當內存分頁發生在OS端時,OS和JVM之間的分頁對象是如何處理的? – user826323

+0

對於操作系統,JVM進程就像沒有特殊訪問的任何其他進程。因此,當JVM想要訪問當前在虛擬內存中的對象時,基於需求,操作系統將其從虛擬內存中傳回並使其可用。同時,操作系統可能會將一些對象內容轉移到虛擬內存。如果你想知道什麼時候會發生,那麼當JVM請求OS獲取對象位於某個地址時會發生這種情況,這取決於哪個操作系統獲取了內容並將其他頁面放在其他地方 – Jatin

2

簡短的回答是:JVM絕對沒有辦法知道操作系統交換堆或防止交換。

更準確地說,您可以打開JVM標誌以防止交換(-XX:+UseLargePages),但是如果操作系統耗盡大頁面,它將恢復爲常規交換。此外,任何GC循環都會強制每個頁面被讀取到RAM中,以便可以對其進行檢查。所以基本上,交換+ Full GC =你會碰到一個Stop-The-World的地獄。

G1會有一個稍微不同的行爲,因爲它會首先收集填充了死對象的內存區域,但由於頁面錯誤它仍然需要更多時間。

希望有幫助!

+0

謝謝。如果分頁由OS處理,爲什麼OutOfMemory發生? – user826323

+0

好吧,OutOfMemoryError意味着堆(這些1.2GB)不足以存儲您創建的每個對象,它不直接鏈接到分頁。 –