HotSpot 垃圾收集器實現
曲沃ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯建站的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
使用場景,大多數服務器是單核CPU。
適用收集場景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection)
又叫吞吐量收集器(throughput collector)應用于多核系統。
適用收集場景:1. 新生代收集是并行處理。2. 老年代收集和
Serial Collector
一樣。
The parallel compacting collector was introduced in J2SE 5.0 update 6. The difference between it and the parallel collector is that it uses a new algorithm for old generation garbage collection.
Note: Eventually, the parallel compacting collector will replace the parallel collector.
上述文字中斜體文字告訴我們,這個收集器和上一個并行收集器唯一的不同是在老年代使用了新的算法。
適用收集場景:1. 新生代收集(Young Generation Collector) 和Parallel Collector 相同;2. 老年代收集(Old Generation Collector)
Young generation collections 通常不會造成長時間停頓,然而old generation collections卻是是造成長時間停頓的,雖然它不長出現,特別是在大的heaps回收被涉及到的時候。為了處理這個問題,HotSpot JVM 引入了一個叫做
concurrent mark-sweep(CMS) collector
,通常也被稱為低延時收集器low-latency collector
.適用場景: 僅適用于老年代,新生代處理方式和Parallel Collector相同。
G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector. 計劃將G1作為CMS收集器的長久替代物。
它是為了平衡 延時和吞吐量之間的一種最優關系。
G1將堆分成若干固定大小的Region/區域(區域大小只有1、2、4、8、16和32M),G1的新生代和老年代都是一個無需連續的區域集合,每一個區域獨立進行內存的分配和回收,區域是內存管理的基本單元,在某一個時間節點,可能是空閑的,當內存被請求時,內存管理器將空閑的Region分配到某個分代,然后歸還應用分配給的空間。
大多數情況下,GC的操作同一時間只會在一個區域進行。
Region 分布
超大對象(Humongous Objects)
下圖中跨區域的灰色模塊即代表了超大對象,超大對象是指那些空間大小
>=1/2
個區域空間的對象.超大對象有時候會被以下特殊方式處理:
- 每個超大對象在老年代區域中的連續區域分配。對象分配起始于在連續區域中的首個成員,如果連續區域中的最后一個區域存在剩余空間的話,那么該空間將失去分配的機會,直到其關聯的超大對象被完全回收
- 超大對象的回收通常僅在Cleanup停頓中的Marking結束后、或者在Full GC時。
- 超大對象的分配可能造成垃圾收集停頓過早地發生(主要是因為空間浪費。)
- 超大對象絕不會發生移動,即使在沒有Full GC的情況下
回收周期
Young-only 階段的垃圾 收集時逐漸地將老年代的對象填充到當前可用的內存。即將可以提升的新生代對象提升到老年代。
該階段開始于Young-only的 收集動作,也就是下圖中的藍色小球,每一個小球都是一次收集動作,也就是提升對象到老年代。Young-only 與Space-reclamation 過渡實際上是開始于老年代空間 *占用*
達到某個閾值,即Heap初始化占用閾值。此時,G1將調度Initial Mark的Young-only收集(藍色大球),而非常規的Young-only(藍色小球)收集。
Initial Mark
此類收集開始于標記過程,附帶一個常規的Young-only收集,并發標記決定所有在老年代區域中可達的存活對象是否要遺留到Space-reclamation 階段。當標記過程未結束時,常規的Young-only 收集可能已經發生,等到標記完成時,將伴隨著兩個特殊的Stop-The-World
停頓,Remark
和CleanUp
.
Remark 停頓
因為在Initial Mark
標記過程中,因為它是并發執行,有可能會發生Young-only
收集,造成標記數據有誤差,因此需要重新標記一次,該過程為串行執行,會造成Stop-The-World
.
在Remark 和Cleanup之間,G1將并發地計算出一份對象存活性總結報告,它將在Cleanup停頓階段更新內部的數據結構
Cleanup 停頓
該停頓同樣將完整的回收空閑區域,并且決定Space-reclamation
階段是否需要繼續跟蹤,如果繼續跟隨的話,Young-only階段的完成僅僅做Young-only
收集動作。
Space-reclamation(空間回收/復用)階段是回收老年代空間,同時處理新生代。
這個階段由多個混合的收集動作組成,不僅包含新生代區域,同時也會排除老年代區域的存活對象,當G1發覺依然無法滿足空閑的空間請求時,G1會終止本階段。如果應用消耗完內存,G1將執行Stop-The-World
的全堆壓縮(Full GC)。
如下圖所示:
2種過程是循環往復收集。
Initiating Heap Occupancy Percent(IHOP): Initial Mark 收集觸發的閾值,為老年代空間定義Heap占用的百分比。
JVM 設置參數:-XX:InitiatingHeapOccupancyPercent
默認情況下,根據標記時間以及老年代在標記周期中的內存分配,G1垃圾收集器將自動抉擇理想的IHOP的值。
JVM 失效參數:-XX:-G1UseAdaptiveIHOP
修改區域空間大小
-XX:G1HeapRegionSize
G1 不區分新/老生代,只區分Region
Young-only
和Space-reclamation