天天看點

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

作者:大資料架構師

停頓時間相關參數

部分垃圾回收器實作了GC執行時應用最大停頓時間的功能,是以提供參數用于應用控制停頓時間。另外,GC為了滿足停頓時間,會設計和實作一些動态算法來調整堆空間,進而滿足停頓時間這個目标。本節介紹相關參數。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數表示GC的最大的停頓時間。不同GC對于該參數的行為不一緻,具體來說:

1)若Parallel GC中GC執行的時間超過該值,将導緻調整新生代和老生代的大小(參數UseAdaptiveSizePolicy設定為true)。參數的預設值為4294 967 295,大約為50天(是以通常不會觸發這個調整政策)。

2)若G1中GC執行的時間超過該值,将導緻調整新生代的大小和混合回收時分區的個數(如果沒有固定新生代大小就會自動調整)。參數在G1中的預設值為200,表示GC的最大停頓時間為200毫秒。

3)在CMS中設定參數無效果。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數表示兩次Minor GC發生之間最小的間隔時間。參數的預設值為0,自動被設定為MaxGCPauseMillis+1,表示GC最小間隔1毫秒。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數表示Minor GC最大的目标停頓時間。從JDK 8開始被标記為丢棄,與Max-GCPauseMillis功能類似。使用該參數在UseAdaptiveSizePolicy設定為true時才生效。參數的預設值為4 294 967 296,大約為50天。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數是垃圾回收時間與非垃圾回收時間的比值,垃圾回收時間占比期望為

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

。例如,-XX : GCTimeRatio = 19時,表示5%的時間用于垃圾回收。

1)預設值為99,即1%的時間用于垃圾回收。

2)在G1中該預設值被修改為9,即10%的時間用于垃圾回收。

3)在CMS中設定無效果。

執行效率相關參數

本節介紹執行效率相關參數,對GC來說,效率主要展現在配置設定和回收上。

以配置設定為例,為了能高效地配置設定,設計了TLAB的配置設定方法,減少了多個Mutator配置設定時鎖的競争。但是TLAB的使用可能帶來碎片化的問題,是以提供了一系列的參數用于設定TLAB大小、TLAB自動調整等參數。以回收為例,一些GC實作會提供局部标記棧來加速GC的執行,而局部标記棧的大小會影響執行效率,是以提供參數用于設定其大小。其他與GC執行效率相關的參數都在本節介紹。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在複制對象時(并行複制中會涉及轉移對象),如果待轉移對象是數組類型,将數組拆分成多個子對象,便于線程的并行化複制。在Parallel GC和G1中行為稍有不同:

1)Parallel GC中參數PSChunkLargeArrays為true且數組的長度超過1.5×ParGCArray-ScanChunk時,數組會被截斷成多個小對象轉移。

2)G1中,在複制對象時,如果待轉移對象是數組類型,當數組的長度超過2×ParGCArray-ScanChunk時,數組會被截斷成多個小對象轉移。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在Parallel GC中控制新生代對象晉升到老生代的門檻值。如果該參數為true,則表示不允許調整晉升門檻值,并且對象晉升的門檻值為最大值(0)。即隻需要經過一次Minor GC,對象就會晉升到老生代。參數的預設值為false。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數為在Parallel GC中控制新生代對象晉升到老生代的門檻值。如果該參數為true,則表示不允許調整晉升門檻值,并且晉升的門檻值為最大值(15)。即需要經過15次Minor GC,對象才能晉升到老生代。參數的預設值為false。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在進行Parallel GC的串行/并行壓縮時,該參數為true,會先執行MinorGC。

在進行Serial GC的串行壓縮時,以及在CMS的Full GC、CMS中進行再标記時,該參數為true,會先執行Minor GC。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

如果GC請求來自Java應用代碼System.gc,當該參數為true時,并發執行垃圾回收;當該參數為false時,CMS串行執行,G1/Shenandoah并行執行。參數的預設值為false。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

如果GC請求來自JNI Locker,當該參數為true時,并發執行垃圾回收;

當該參數為false時,CMS串行執行,G1/Shenandoah并行執行。參數的預設值為false。

該參數在JDK 15中被移除,原因是參數可能導緻潛在的死鎖。更多資訊可以參考Jira。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在G1中,當調整新生代的大小時,額外擴充一定比例的記憶體。參數的預設值為5,表示額外擴充5%的新生代大小。

注意,在原文注釋中,該參數用于GC Locker的情況,但是現在的作用已經發生了變化。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在執行GC Locker請求時又觸發了GC的情況下,因為GC動作需要等待JNILocker釋放才能執行,為了避免JNI Locker阻塞時間太長而導緻GC執行不及時,進而影響Mutator可用的記憶體,是以設計了重試機制,該參數控制GC重試的次數。

參數的預設值為2,表示JNI Locker釋放後最多連續執行2次垃圾回收來滿足Mutator的記憶體配置設定請求,超過2次GC則配置設定失敗。

為什麼隻在GC Locker的情況下才會重試?一個可能的情況是:當多個線程執行的時候,有線程請求執行GC;有線程正在執行JNI的代碼通路Java對象,此時多個線程的配置設定請求将推遲到GC完成之後。當JNI代碼退出時,如果發現執行期間其他線程有GC請求,會設定GC Locker活躍。但多個線程會同時請求配置設定記憶體,這可能會導緻一些線程連續多次不能配置設定成功,是以希望再嘗試幾次回收,避免線程無法成功配置設定到記憶體。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

Mutator使用TLAB配置設定記憶體,可以減少鎖沖突。關于TLAB的資訊,可以參考3.2.1節。參數的預設值為true,表示使用TLAB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數用于在GC運作結束後動态地調整TLAB的大小,适用于Serial/ParNew/Parallel GC/G1/Shenandoah。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數将Mutator新配置設定的TLAB初始化為0。參數的預設值為false,表示不初始化TLAB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數表示TLAB塊的大小的最小值。預設為2KB,當小于該值時,TLAB将使用2KB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數表示TLAB塊的初始值大小。參數的預設值為0。如果沒有設定,那麼JVM一般會自動推斷,推斷的方法是根據所有線程曆史使用的TLAB個數和堆空間大小計算。

在TLAB的使用過程中會記錄配置設定TLAB的個數,在GC執行時會将個數存放在曆史資料中,然後預測未來TLAB使用的個數。參數TLABAllocationWeight控制的是預測時最新一次TLAB個數對預測值的貢獻。參數的預設值為35,表示最新個數在預測值中會貢獻35%,記預測值為desired_tlab。

另外,在TLAB使用過程中可能存在浪費的情況,按照機率,平均浪費為50%(實際浪費率遠低于該值)。為了準确地控制浪費率,提供了參數TLABWasteTargetPercent,浪費率

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

,記為refill_target,參數TLABWasteTargetPercent的預設值為1,表示TLAB有50%的浪費率,如果将參數TLABWasteTargetPercent設定為5,則表示TLAB有10%的浪費率。

TLABSize的推斷公式為

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

進行TLAB配置設定時,當請求的記憶體位元組數小于一定門檻值

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

時,參數TLABRefillWasteFraction的預設值為64,即TLAB剩餘1/64的空間大小,且無法滿足Mutator的配置設定請求時将被丢棄。丢棄意味着這部分剩餘空間将被填充一個dummy對象。

還有另外一種情況,如果遇到TLAB剩餘空間不足,無法滿足Mutator的配置設定請求,但還不能丢棄的情況(剩餘空間還比較多),此時會直接在堆(Heap)中配置設定對象。這種情況每發生一次,将TLAB浪費(丢棄)的門檻值

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

的增加浪費加上參數TLABWasteIncrement,參數的預設值是4。

參數TLABWasteIncrement是為了防止出現因門檻值設定較小,TLAB一直無法丢棄,但剩餘空間又無法滿足Mutator的配置設定請求的情況。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在ParNew/G1中,對象晉升會在PLAB中請求記憶體,若PLAB無法滿足配置設定請求,且PLAB中剩餘的記憶體位元組數小于PLABSize和參數ParallelGCBufferWastePct比例的乘積,即

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

,則PLAB剩餘空間将被丢棄。參數的預設值為10,表示若PLAB中剩餘10%且無法滿足對象晉升的配置設定請求時将被丢棄。丢棄意味着這部分剩餘空間将被填充一個dummy對象。

參數ParallelGCBufferWastePct與TLAB中TLABRefillWasteFraction的含義類似。

ParNew是在To空間配置設定,G1在新生代配置設定。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

以上參數控制在Minor GC執行結束後是否動态調整PLAB的大小。其中PLAB的作用與TLAB類似,不過PLAB分為兩類,分别稱為YoungPLAB和OldPLAB,其中YoungPLAB用于Minor GC中活躍對象從Eden到Survivor分區的配置設定,而OldPLAB則用于Minor GC中活躍對象從Survivor到Old的晉升。

參數ResizePLAB在ParNew中僅僅調整YoungPLAB的大小;在G1中調整YoungPLAB和OldPLAB的大小。參數的預設值為true,表示允許調整。

參數ResizeOldPLAB用于調整CMS中OldPLAB的大小。參數的預設值為false,表示不允許調整,并且參數在JDK 14中被移除,是以也不适用于JDK17。

參數ResizePLAB和ResizeOldPLAB不适用于Parallel GC,Parallel GC并未實作PLAB大小調整的功能,而是使用固定大小。

YoungPLAB的調整通常需要所有GC工作線程的統計資訊,如YoungPLAB配置設定的次數、大小、碎片化,然後預測後續YoungPLAB的大小。YoungPLAB使用撞針的配置設定方法,雖然有一定的碎片化情況(在PLAB的尾部可能存在碎片化),但能明顯地提高性能。

在CMS中,OldPLAB的設計會相對困難。通常在CMS中通常會避免動态調整老生代OldPLAB。原因是動态調整OldPLAB可能會加劇老生代碎片化。

主要是因為CMS老生代是FreeList的方式,對于大小為[0,256]字的對象,直接在List高速配置設定,對于超過256字大小的對象,在一個字典中配置設定。如果要在CMS中為OldPLAB增加性能效率,需要為所有不同大小的List配置設定緩存,為每一個GC工作線程都配置設定緩存,這樣的List才能做到高效無鎖的配置設定,但這樣的設計将導緻更大的碎片化。為了在配置設定效率和碎片化之間取得平衡,CMS實際上是為所有的GC工作線程緩存一個[0,256]字大小的清單,但是會根據GC使用字大小的情況預留一些空間,比如16字大小可能會預留5個空間。

使用ResizeOldPLAB會在每次GC結束後調整清單預留的個數,随着應用的執行,可能會導緻碎片化越來越嚴重。在運作的後期可能會因為碎片化觸發Full GC。

是以通常在CMS中禁止自動調整OldPLAB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

參數YoungPLABSize指定Parallel GC/ParNew/G1執行過程中YoungPLAB的大小。參數OldPLABSize指定Parallel GC/ParNew/G1執行過程中OldPLAB的大小。參數YoungPLAB-Size的預設值為4096,表示YoungPLAB緩沖區的大小為4096字。參數OldPLABSize的預設值為1024,表示OldPLAB緩沖區的大小為1024字。

Parallel GC中不支援動态調整PLAB,Serial GC是串行的,無須支援這兩個參數。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數是對整個Survivor空間進行劃分的比例。

G1中利用該值計算To空間分區的大小,計算方式為

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

,其中Survivor_size是兩個Survivor分區空間的大小,如果TargetSurvivorRatio增大,那麼用于下一次To空間的空間變大,晉升到Old分區的機率會減小。

在Serial和CMS中可以通過該參數調整晉升對象的次數。該參數越大,To空間越大,晉升對象溢出的機率越小。

參數的預設值為50,表示To空間占Survivor分區的50%。

另外,該參數還與TargetPLABWastePct一起用于調整PLAB的大小。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

TargetPLABWastePct是用于控制計算動态PLAB的大小參數之一。該參數與參數TLABWasteTargetPercent的作用類似,為了準确控制PLAB浪費率,提供了參數TargetPLAB-WastePct。

在PareNew中,浪費率

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

記為refill_target,公式的含義是将Survivor分區中To分區的浪費率看作整個Survivor的浪費率,在ParNew中參數TargetPLAB-WastePct不能大于參數TargetSurvivorRatio,否則表示沒有任何浪費,就沒有意義。

在G1中的用法也與之類似,隻不過公式稍有不同,參數TargetPLABWastePct表示浪費的比例,即

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

。關于G1的參數,在12.2節中還會介紹。

參數TargetPLABWastePct的預設值為10,表示PLAB的浪費比例。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在計算ParNew/G1中PLAB的大小時,使用的是衰減平均值的方法,通過曆史PLAB的大小預測未來PLAB的大小。該參數表示最新的PLAB大小對預測值的貢獻度。

參數PLABWeight的預設值為75,表示預測下一次YoungPLABSize時最新YoungPLAB-Size的貢獻度為75%。

參數OldPLABWeight的預設值為50,表示預測下一次OldPLABSize時最新OldPLAB-Size的貢獻度為50%。該參數僅适用于CMS,且在JDK 17中被移除。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

Mutator配置設定對象時,若對象超過一定的門檻值,則直接在老生代中配置設定,該參數控制門檻值。參數PretenureSizeThreshold的預設值是0,表示對象不管多大,都是先在Eden中配置設定記憶體。該參數不适用于G1、Shenandoah,它們設定了大對象分區(G1中可以認為大對象分區是老生代分區,Shenandoah中隻有一個代),當Mutator配置設定的對象大小超過一定的門檻值時,直接在大對象分區中配置設定。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

當JVM向OS送出記憶體後,把送出的記憶體初始化為0,這将通路記憶體(可能引起OS的缺頁中斷)。在Shenandoah中,該參數會被強制設定為false。使用該參數的目的是在初始化時確定記憶體被配置設定,在Mutator運作過程中不會再出現按需使用的情況,這會降低初始化時的性能,但能加速運作時性能。該參數的預設值為false,表示不對送出的記憶體初始化。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

當JVM向OS送出記憶體後,把送出的記憶體初始化為0,多個線程并行執行送出,每個線程送出的最小值。該參數的預設值與OS相關,在Linux系統中預設值為4MB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

Minor GC中采用深度周遊進行複制,需要使用标記棧,通過該參數可設定标記棧的最大值。在64位系統中,預設值為512MB,在非64位系統中為4MB。

Parallel GC中線程私有标記的大小是固定設定,不可以通過參數設定。

在64位系統中,預設值為512KB,在非64位系統中為64KB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數表示Minor GC中标記棧的大小。在64位系統中預設值為4MB,在非64位系統中為32KB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數表示ZGC中并發标記過程中多個GC工作線程标記棧的最大值。參數的預設值為8GB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數表示Java語言中引用對象的标記政策控制。共分以下兩種。

0:引用者(Reference)位于老生代,被引用者(Referent)位于新生代,隻有這樣的Referent才能作為活躍對象。該政策被稱為ReferenceBasedDiscovery。

1:被引用者(Referent)位于新生代,而引用者(Reference)既可以位于新生代,也可以位于老生代,将這樣的Reference作為活躍對象進行周遊。該政策被稱為ReferentBasedDiscovery。

和政策0相比,政策1可以更快地把引用對象加入活躍對象中,但是可能會帶來額外的浮動垃圾。參數的預設值為0。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數控制Java的引用是否并行處理,适用于Parallel GC/CMS/G1,ZGC和Shen-andoah是并發執行的,故不受該參數控制。參數的預設值在不同的GC和不同的JDK版本中不同,例如在JDK 17中Parallel GC設定為false,表示不開啟并行處理;在G1中設定為true,表示開啟任務處理。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數控制Java的并行引用處理過程中是否使用任務均衡機制來加速引用處理。引用處理的任務均衡指的是對同一類型引用任務隊列(queue)進行平衡。參數的預設值為true,表示進行任務均衡。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

這些參數用于控制是否允許在GC運作時檢查GC占用的時間和空間是否超過一定的門檻值,如果超過并且達到一定的次數後,在Full GC執行完成後對Mutator的對象配置設定請求會強制傳回NULL(表示OOM異常)。次數通過參數AdaptiveSizePolicyGCTimeLimitThreshold(後被改名為GCOverheadLimitThreshold)控制,但是該參數是開發參數,預設值為5,不能在釋出版本中修改。

GC時間占用的比例超過參數GCTimeLimit定義的門檻值,表示系統負載較重。參數的預設值為98,當參數設定為100時,表示不進行檢查,相當于将參數UseGCOverheadLimit設定為false。

若堆空間中新生代和老生代可用空間的比例低于參數GCHeapFreeLimit定義的門檻值,則表示系統幾乎沒有空閑的空間。參數的預設值為2,表示當FullGC發生時,老生代空閑的記憶體小于老生代記憶體的2%,且新生代空閑的記憶體小于新生代記憶體的2%,表示系統負載較重,後續在Full GC進行之後可能在對象配置設定時強制傳回NULL。

需要注意的是,該參數僅僅統計Full GC的運作情況。

參數UseGCOverheadLimit的預設值為true,參數GCTimeLimit的預設值為98,參數GCHeapFreeLimit的預設值為2。這3個參數可以簡單總結為,當發現有5次Full GC(不需要連續5次GC都是Full GC,也不是最近5次Full GC)時,垃圾回收時間占比達到98%,并且新生代和老生代的空閑記憶體都小于各自分區的2%時,在這次Full GC後Mutator再有記憶體請求,将終止運作。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在新生代的串行/并行複制算法中,可以使用硬體指令(prefetch)預取資料,用于減少Cache Miss。例如64位Linux通過prefetch0指令将memory的資料預讀取到cache中,以減少通路主存的指令執行時的延遲。在Linux的64位系統中,該值被設定為576。該參數與硬體相關,不同的硬體中設定不同。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在新生代的串行/并行複制算法、并發掃描、Full GC中,會掃描記憶體。

在Linux 64位系統中,PrefetchScanIntervalInBytes的值被設定為576。該參數與硬體相關,不同的硬體中設定不同。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數用于設定是否允許優化處理卡表。在執行store指令,C1/C2生成代碼時,如果發現卡表已經被設定,則可以不再設定卡表。在Serial/Parallel GC中不會涉及并發處理,是以非常簡單。CMS可能涉及并發處理卡表,是以在檢查卡表時還需要通過記憶體屏障指令進行資料同步。參數的預設值為false。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數用于設定是否允許GC工作線程和CPU綁定,目前僅支援Solaris系統。參數的預設值為false,在JDK 17中已經被删除。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

使用該參數,将根據親緣性,把GC任務固定到對應的線程上。GC任務指的是Parallel GC中的複制/标記等。參數的預設值為false,在JDK 17已經被删除。

如果JVM沒有支援綁定CPU,是否存在其他方法實作線程和CPU的綁定?在Linux系統中可以通過taskset指令實作綁定。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在分代垃圾回收器中,每次垃圾回收完成後可以調整新生代的大小,在調整時,根據線程的個數乘以該參數值,增加到新生代的空間中。

不同平台上該參數的預設值不同。在Linux/X86系統中該值為4KB。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

該參數指定當連續進行一定次數的垃圾回收動作後,将輸出警告資訊(主要是進行了幾次垃圾回收、請求的記憶體等資訊)。參數的預設值為0,表示不輸出。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

根據強分代理論,如果對象長期存活,可能在後續也會繼續存活,可以把這些可能長期存活的對象放在一起,然後在Full GC時跳過這部分空間,可以節約回收的時間。但是在運作過程中,這些長期存活的對象一定會有對象死亡,此時按照标記-壓縮算法就需要對這些對象占用的空間進行壓縮,無法節約時間。為此,引入參數MarkSweepDeadRatio,表示當死亡對象尚未超過空間的一定門檻值時,仍然不移動壓縮這些活躍對象。

參數的預設值為5,表示死亡對象浪費的最大占比為堆空間的5%。

Parallel GC在初始時将該參數的預設值修改為1。

在JDK 17中,G1開始支援該參數。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

由于使用參數MarkSweepDeadRatio會跳過部分死亡對象,是以會導緻Full GC壓縮效率不高,是以經過一定次數的Full GC後,會強制執行一次不跳過任何死亡對象的标記-壓縮。參數MarkSweepAlwaysCompactCount控制跳過死亡對象的标記-壓縮次數。參數的預設值為4,表示每4次跳過死亡對象後,第5次Full GC不會跳過死亡對象。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

在并行複制算法和并發标記中,可能涉及多個線程的任務均衡,從其他線程的标記棧取資料,VM為了保證每個線程執行的效率,會為每個線程保留一定數量的對象,保留對象暫時不被其他線程竊取。參數GCDrainStackTargetSize控制線程标記被保留的數量,預設值為64,表示保留64個對象用于線程竊取。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

使用該參數,調用System.gc()時不觸發垃圾回收。其預設值為false,表示觸發Java代碼中調用System.gc()會觸發Full GC。

在一些Java代碼RMI的實作中,有一個周期性線程調用System.gc(),而Full GC又影響性能,當發現記憶體滿足應用的需求時可以使用該參數。

透徹了解JVM中垃圾回收GC生産參數,停頓時間+執行效率相關參數

篇文章給大家講解的内容是JVM中垃圾回收相關參數介紹:GC通用參數,GC生産參數,停頓時間+執行效率相關參數

  1. 下篇文章給大家講解的内容是JVM中垃圾回收相關參數介紹:GC通用參數,GC生産參數,大頁和NUMA參數+GC日志相關參數+其他參數
  2. 感謝大家的支援!

繼續閱讀