java gc的特性_Java12新特性 -- 可中断的G1 Mixed GC
Java 12 中增強了 G1 垃圾收集器關(guān)于混合收集集合的處理策略,這節(jié)主要介紹在 Java 12 中同時也對 G1垃圾回收器進行了改進,使其能夠在空閑時自動將 Java 堆內(nèi)存返還給操作系統(tǒng),這也是 Java 12 中的另外一項重大改進。
目前 Java 11 版本中包含的 G1 垃圾收集器暫時無法及時將已提交的 Java 堆內(nèi)存返回給操作系統(tǒng)。為什么呢? G1目前只有在full GC或者concurrent cycle(并發(fā)處理周期)的時候才會歸還內(nèi)存,由于這兩個場景都是G1極力避免的,因此在大多數(shù)場景下可能不會及時歸還committed Java heap memory給操作系統(tǒng)。除非有外部強制執(zhí)行。
在使用云平臺的容器環(huán)境中,這種不利之處特別明顯。即使在虛擬機不活動,但如果仍然使用其分配的內(nèi)存資源,哪怕是其中的一小部分,G1 回收器也仍將保留所有已分配的 Java 堆內(nèi)存。而這將導致用戶需要始終為所有資源付費,哪怕是實際并未用到,而云提供商也無法充分利用其硬件。如果在此期間虛擬機能夠檢測到 Java 堆內(nèi)存的實際使用情況,并在利用空閑時間自動將 Java 堆內(nèi)存返還,則兩者都將受益。
具體操作
為了盡可能的向操作系統(tǒng)返回空閑內(nèi)存,G1 垃圾收集器將在應用程序不活動期間定期生成或持續(xù)循環(huán)檢查整體 Java堆使用情況,以便 G1 垃圾收集器能夠更及時的將 Java 堆中不使用內(nèi)存部分返還給操作系統(tǒng)。對于長時間處于空閑狀態(tài)的應用程序,此項改進將使 JVM 的內(nèi)存利用率更加高效。
而在用戶控制下,可以可選地執(zhí)行Full GC,以使返回的內(nèi)存量最大化。
JDK12的這個特性新增了兩個參數(shù)分別是G1 PeriodicGCInterval及G1 PeriodicGCSystemLoadThreshold,設置為0的話,表示禁用。如果應用程序為非活動狀態(tài),在下面兩種情況任何一個描述下,G1 回收器會觸發(fā)定期垃圾收集:
自上次垃圾回收完成以來已超過 G1PeriodicGCInterval ( milliseconds ), 并且此時沒有正在進行的垃圾回收
任務。如果 G1PeriodicGCInterval 值為零表示禁用快速回收內(nèi)存的定期垃圾收集。
應用所在主機系統(tǒng)上執(zhí)行方法 getloadavg(),默認一分鐘內(nèi)系統(tǒng)返回的平均負載值低于
G1PeriodicGCSystemLoadThreshold指定的閾值,則觸發(fā)full GC或者concurrent GC( 如果開啟
G1PeriodicGCInvokesConcurrent ),GC之后Java heap size會被重寫調(diào)整,然后多余的內(nèi)存將會歸還給操作系統(tǒng)。如果 G1PeriodicGCSystemLoadThreshold 值為零,則此條件不生效。
如果不滿足上述條件中的任何一個,則取消當期的定期垃圾回收。等一個 G1PeriodicGCInterval 時間周期后,將重新考慮是否執(zhí)行定期垃圾回收。
G1 定期垃圾收集的類型根據(jù) G1PeriodicGCInvokesConcurrent 參數(shù)的值確定:如果設置值了,G1 垃圾回收器將繼續(xù)上一個或者啟動一個新并發(fā)周期;如果沒有設置值,則 G1 回收器將執(zhí)行一個Full GC。在每次一次 GC 回收末尾,G1 回收器將調(diào)整當前的 Java 堆大小,此時便有可能會將未使用內(nèi)存返還給操作系統(tǒng)。新的 Java 堆內(nèi)存大小根據(jù)現(xiàn)有配置確定,具體包括下列配置:- XX:MinHeapFreeRatio、-XX:MaxHeapFreeRatio、-Xms、-Xmx。
默認情況下,G1 回收器在定期垃圾回收期間新啟動或繼續(xù)上一輪并發(fā)周期,將最大限度地減少應用程序的中斷。如果定期垃圾收集嚴重影響程序執(zhí)行,則需要考慮整個系統(tǒng) CPU 負載,或讓用戶禁用定期垃圾收集。
總結(jié)
以上是生活随笔為你收集整理的java gc的特性_Java12新特性 -- 可中断的G1 Mixed GC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: markdown 流程图_测试了12款M
- 下一篇: java外部类_Java里什么叫内部类什