2012-02-21 15 views
10

問題基本上包含在標題中。JVM在達到-Xmx限制時是否強制進行垃圾回收?

說你有已達到其JVM -Xmx限制的應用程序。當那個應用程序需要更多的內存時垃圾回收被強制? (在HotSpot JVM中)

另一個我不能解釋的奇怪現象是,我目前有一個運行-Xmx = 2048m的應用服務器,「top」命令(在Linux上)報告2.7g處理。

因此,如何/當應用程序超過其-Xmx?

感謝,

+1

'-Xmx = 2048'爲2048個字節。我假設你的意思是'-Xmx = 2048m'注意:你可以只寫'-mx2g'這是同樣的事情。 – 2012-02-21 12:12:42

+0

@PeterLawrey謝謝,是的,我的意思是2048米。編輯了這個問題。 – Simeon 2012-02-21 15:32:12

回答

11

其實當年輕一代已滿(不是整個堆)正常GC被觸發,並且當沒有留下生存空間所以有些對象需要被遷移到老一代空間被觸發重大GC。

+2

+1:通常完整的終身空間是觸發完整GC的原因。次要收集通常通過在發生這種情況之前將物體移動到終身空間來避免倖存空間的填充。 – 2012-02-21 12:11:17

+2

'-Xmx'只設置最大堆大小。這通常是最大的區域,但不是唯一的區域。你有線程堆棧,直接內存,共享庫,JVM本身等。 – 2012-02-21 12:17:57

1

是的,如果你不還覺得內存它將引發OutOfMemory錯誤。我明白這一點。

3

這在通常情況下,althought GC通常觸發更快,這取決於你使用的垃圾收集器。

1

IIRC的保證是引發的OutOfMemoryError前一個完整的GC將被執行。由於超出堆大小限制必須導致這樣的錯誤,這意味着當達到限制時,您將始終至少有一個完整的GC運行。

3

是的,JVM肯定會調用GC如果達到堆限制(可能更快)。如果這沒有幫助,它會拋出OutOfMemoryError s。

您看到更大的進程內存消耗的原因是-Xmx選項僅限制Java堆空間(Java對象分配的位置)。 JVM還有其他幾個內存區域:線程堆棧的空間,「PermGen」(存儲類和它們的代碼的地方),通過ByteBuffers分配的「直接」內存,本地庫分配的內存等。對於一些在這些額外的內存區域中,還存在其他允許限制它們的配置選項,例如-Xss,但有些甚至無法控制JVM。

0

垃圾收集是一個相當大的面積,但你說的完全集合是正確的(也有其他類型)

有一點要注意的是,-Xmx設置最大堆大小,但也有一個-Xms,這是最小的堆大小。您的應用程序可能只從最低配置開始。然後,如果使用的內存達到了,它將觸發完整的垃圾收集,並將可用堆的數量從最小值(-Xmx)增加到小於或等於最大值(-Xmx)的某個值。這可能會發生多次,直到達到最大值。之後,它不能再增加堆,但當達到最大值時,垃圾收集將繼續發生。