Java 12 中加強了 G1 垃圾收集器關於混合收集集合的處理策略,這節主要介紹在 Java 12 中同時也對 G1垃圾回收器進行了改進,使其可以在空閒時自動將 Java 堆內存返還給操做系統,這也是 Java 12 中的另一項重大改進。併發
目前 Java 11 版本中包含的 G1 垃圾收集器暫時沒法及時將已提交的 Java 堆內存返回給操做系統。爲何呢? G1目前只有在full GC或者concurrent cycle(併發處理週期)的時候纔會歸還內存,因爲這兩個場景都是G1極力避免的,所以在大多數場景下可能不會及時歸還committed Java heap memory給操做系統。除非有外部強制執行。操作系統
在使用雲平臺的容器環境中,這種不利之處特別明顯。即便在虛擬機不活動,但若是仍然使用其分配的內存資源,哪怕是其中的一小部分,G1 回收器也仍將保留全部已分配的 Java 堆內存。而這將致使用戶須要始終爲全部資源付費,哪怕是實際並未用到,而云提供商也沒法充分利用其硬件。若是在此期間虛擬機可以檢測到 Java 堆內存的實際使用狀況,並在利用空閒時間自動將 Java 堆內存返還,則二者都將受益。內存
爲了儘量的向操做系統返回空閒內存,G1 垃圾收集器將在應用程序不活動期間按期生成或持續循環檢查總體 Java堆使用狀況,以便 G1 垃圾收集器可以更及時的將 Java 堆中不使用內存部分返還給操做系統。對於長時間處於空閒狀態的應用程序,此項改進將使 JVM 的內存利用率更加高效。資源
而在用戶控制下,能夠可選地執行Full GC,以使返回的內存量最大化。get
JDK12的這個特性新增了兩個參數分別是G1 PeriodicGCInterval及G1 PeriodicGCSystemLoadThreshold,設置爲0的話,表示禁用。若是應用程序爲非活動狀態,在下面兩種狀況任何一個描述下,G1 回收器會觸發按期垃圾收集:虛擬機
若是不知足上述條件中的任何一個,則取消當期的按期垃圾回收。等一個 G1PeriodicGCInterval 時間週期後,將從新考慮是否執行按期垃圾回收。it
G1 按期垃圾收集的類型根據 G1PeriodicGCInvokesConcurrent 參數的值肯定:若是設置值了,G1 垃圾回收器將繼續上一個或者啓動一個新併發週期;若是沒有設置值,則 G1 回收器將執行一個Full GC。在每次一次 GC 回收末尾,G1 回收器將調整當前的 Java 堆大小,此時便有可能會將未使用內存返還給操做系統。新的 Java 堆內存大小根據現有配置肯定,具體包括下列配置:- XX:MinHeapFreeRatio、-XX:MaxHeapFreeRatio、-Xms、-Xmx。io
默認狀況下,G1 回收器在按期垃圾回收期間新啓動或繼續上一輪併發週期,將最大限度地減小應用程序的中斷。若是按期垃圾收集嚴重影響程序執行,則須要考慮整個系統 CPU 負載,或讓用戶禁用按期垃圾收集。容器