JVM G1和CMS

不能衡量,就不能改进,所以是好与是坏,一切都是从如何评价衡量开始的。

停顿时间和吞吐量便是一切垃圾级收集器的评价准则。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.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,040评论 2 31
  • 转载blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile阅读 5,418评论 1 56
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,783评论 3 83
  • 垃圾回收算法具体实现 翻译原文 => plumbr Java GC handbook 前文参见: Java垃圾回收...
    foxracle阅读 2,893评论 0 15
  • 1.一些概念 1.1.数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始...
    落落落落大大方方阅读 4,593评论 4 86