不能衡量,就不能改進,所以是好與是壞,一切都是從如何評價衡量開始的。
停頓時間和吞吐量便是一切垃圾級收集器的評價准則。G1有着更可控的pause time 和 更大的throughput,所以g1在java9 便是默認的垃圾收集器,是cms 的替代者。
所謂的pause time,就是只每次停頓的的時間長度,在jvm運行時候,有可能發生停頓的是,minor gc是Stop the word,還有cms 老年代的過程中,init mark 和 remark,cleanup的時候,注意pause time就是單次時長。為什么我們要關注它呢?因為很多在線服務是必須要是高響應的,沒人願意等太長時間。
而吞吐量是為了在某段時間內最大化利用系統資源,或者為了完成更多的任務。
那么G1為什么會比cms在這兩個指標上都有優異的表現呢?它們的實現又有什么相似和不同之處呢?這可以從堆內存布局開始,因為我們知道垃圾收集收集的是堆內存。
垃圾分代回收的假說源於大都新生對象都是朝生暮死,所以g1之前的收集器,新生代都是一塊連續的物理內存空間,而g1也有新生代,只不過進化成邏輯上連續的,實際上是有大小相等不連續的region組成。老年代之前也是連續的物理空間,到g1也自然而然也是不連續的。
那么為什么這么設計呢?是為了滿足可控的停頓時間的要求。垃圾收集每次是要針對每一代進行收集,之前內存不管怎么分,垃圾收集都是運行在粗粒度的一代上面,而g1把粒度降到了region這個level上,region的選擇可以是那些具有最大回收價值的上面。
因為內存布局的進化,在回收算法上cms之前的標記清除也就不需要了,標記清除造成內存碎片,最終可能引發full gc是非常不可控的。而g1的不管是年輕代或者老年代(mix mode)回收都是copy算法,由此帶來的好處是內存整理好的。
以上非常大概的比較了一下cms和g1.
作者:5ef43bf0252e
鏈接:https://www.jianshu.com/p/337fba17f441
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。