• 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.



    作者:5ef43bf0252e
    链接:https://www.jianshu.com/p/337fba17f441
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    字符串:序列自动机
    图论学习——最大团与最大独立集
    点分治
    图论:Johnson全源最短路
    停止更新博客
    将Eclipse中现有的java类生成类图
    problem:SVN error: (501 Not Implemented)
    SVN 修改URL路径
    eclipse中,把java函数代码折叠/展开
    Build类
  • 原文地址:https://www.cnblogs.com/lishiqi-blog/p/11898914.html
Copyright © 2020-2023  润新知