2017-09-22 67 views

回答

2

當G1發現需要垃圾收集時,它開始收集實時數據最少的區域。 它通過併發標記階段在老一代中發現活體,並將對象分配給年輕一代繼續將老年對象推向老一代。當Java堆佔用總量超過默認閾值時,JVM觸發標記階段。

啓動堆佔用率(IHOP)是觸發初始標記集合的閾值。 G1默認通過觀察標記需要多長時間以及老一代通常分配多少內存來確定最佳IHOP。

新Java中8:

  1. G1收藏家字符串複製是Java 8中加入絃樂以來的新功能需要大量的堆內存,所以這個新功能使G1收集器,以確定字串它們在堆空間中不止一次被複制,並將它們糾正爲指向相同的內部char []數組。

  2. 在Java 8中移除PermGen空間和使用MetaSapce垃圾收集是新事物。有關更多信息,請閱讀this post

2

時將G1(垃圾收集器)開始運行?

當您將 - XX:+UseG1GC添加到JVM參數時,啓用G1GC。

什麼時候會是G1(垃圾收集器)開始運行並且首先在哪個內存區域收集?

參考Oracle tutorial上G1GC。

堆被分區爲一組相等大小的堆區域,每個堆區域都是連續的虛擬內存範圍。某些區域集被分配了相同的角色(eden,倖存者,舊

G1執行併發全局標記階段以確定整個堆中對象的活性。標記階段完成後,G1知道哪些區域大部分是空的。它首先收集這些區域,這通常會產生大量的可用空間。這就是爲什麼這種垃圾收集方法稱爲垃圾優先。顧名思義,G1將其收集和壓縮活動集中在可能充滿可回收對象的堆的區域,即垃圾。 G1使用暫停預測模型來滿足用戶定義的暫停時間目標,並根據指定的暫停時間目標選擇要收集的區域數量。

由G1標識爲回收成熟的區域是使用疏散垃圾收集的。 G1將對象從堆的一個或多個區域複製到堆上的單個區域,並在此過程中壓縮並釋放內存。這種撤離在多處理器上並行執行,以減少暫停時間並提高吞吐量。因此,對於每個垃圾收集,G1持續減少碎片,在用戶定義的暫停時間內工作。這超出了以前兩種方法的能力。