不能衡量,就不能改进,所以是好与是坏,一切都是从如何评价衡量开始的。
停顿时间和吞吐量便是一切垃圾级收集器的评价准则。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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。