2017-06-12 58 views
0

enter image description here (承諾和最高線是相同的)爲什麼GC甚至發生在有大量未使用的內存的左

我在看的內存使用量在一NewRelic的Java應用程序。這裏有幾個問題:

#1

committed PS Survivor Space Heap多樣過去幾天。但是它應該是一個常量,因爲它是由JVM配置的?

#2

從我所瞭解,當有一個垃圾收集堆內存應該減少。 Eden的內存可能會減少,當一個主要的gc或次要的gc發生時,而Old的內存可能會減少,當一個主要的gc發生時。

但是,如果你看看Old內存使用情況,在6月6日到7日之間的某段時間,內存升高,然後降低。這應該代表一個重大的gc發生,對吧?但是,仍有大量未使用的內存。它似乎並沒有達到極限。那麼主要的gc如何被觸發?內存使用量相同,但從未達到極限,但仍然下降。

應用程序從其他地方獲取文件。這個文件可能很大,並在內存中處理。這可以解釋上述問題嗎?

+0

什麼是正在使用的JVM參數? – Fairoz

回答

1

您需要提供更多關於您的配置的信息來明確回答這個問題,我會假設您使用的是Oracle的Hotspot JVM,並且您使用的是G1收集器。發佈啓動JVM的標誌也很有用。

  1. 這裏的關鍵詞是'犯'。這是由JVM保留的內存,但不一定在使用(或者甚至映射到物理頁面,這只是JVM可以使用的一系列虛擬內存)。在java.lang.management包的MemoryUsage類中有一個很好的描述(檢查API文檔)。它表示,「提交表示保證可供Java虛擬機使用的內存量(以字節爲單位)。提交的內存量可能會隨時間變化(增加或減少)。Java虛擬機可能會釋放內存到系統......「這就是你看到它發生變化的原因。

  2. 假設您使用的是G1,那麼收集器會執行增量壓縮。你是正確的,如果收集者無法跟上舊有分配,並且空間不足,它將執行完整的壓縮集合。由於最後一個圖表顯示您在分配的堆空間附近沒有使用,因此這裏不會發生這種情況。但是,爲了避免這種情況,G1會與您的應用程序同時收集和壓縮。這就是爲什麼你看到使用率上升(當你的應用程序實例化更多的對象),然後下降(因爲G1收集器回收不再需要的對象的空間)。有關G1如何工作的更詳細說明,請參閱文檔https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html

相關問題