zoukankan      html  css  js  c++  java
  • jvm回收器回收过程一:CMS和 G1的初认知(持续更新中)

    CMS:介绍:

    1、CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。

    在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。

    CMS采用的基础算法是:标记—清除。 

    2、CMS过程:

    • 初始标记(STW initial mark)
    • 并发标记(Concurrent marking)
    • 并发预清理(Concurrent precleaning)
    • 重新标记(STW remark)
    • 并发清理(Concurrent sweeping)
    • 并发重置(Concurrent reset)

    3、CMS的缺点:

    • MS回收器采用的基础算法是Mark-Sweep。所有CMS不会整理、压缩堆空间。经过CMS收集的堆会产生空间碎片。虽然节约了垃圾回收的停顿时间,但也带来的堆空间的浪费。
    • 需要更多的CPU资源。,为了让应用程序不停顿,CMS线程和应用程序线程并发执行,这样就需要有更多的CPU,单纯靠线程切 换是不靠谱的。
    • CMS的另一个缺点是它需要更大的堆空间。因为CMS标记阶段应用程序的线程还是在执行的,那么就会有堆空间继续分配的情况,为了保证在CMS回 收完堆之前还有空间分配给正在运行的应用程序,必须预留一部分空间。也就是说,CMS不会在老年代满的时候才开始收集。相反,它会尝试更早的开始收集,已 避免上面提到的情况:在回收完成之前,堆没有足够空间分配!默认当老年代使用68%的时候,CMS就开始行动了。 – XX:CMSInitiatingOccupancyFraction =n 来设置这个阀值。

    4、啥时候用CMS

    如果你的应用程序对停顿比较敏感,并且在应用程序运行的时候可以提供更大的内存和更多的CPU(也就是硬件牛逼),那么使用CMS来收集会给你带来好处。还有,如果在JVM中,有相对较多存活时间较长的对象(老年代比较大)会更适合使用CMS。

    G1介绍:

    1、G1将堆空间划分成了互相独立的区块。每块区域既有可能属于O区、也有可能是Y区,且每类区域空间可以是不连续的(对比CMS的O区和Y区都必须是连续的)。

    这种将O区划分成多块的理念源于:当并发后台线程寻找可回收的对象时、有些区块包含可回收的对象要比其他区块多很多。

    虽然在清理这些区块时G1仍然需要暂停应用线程、但可以用相对较少的时间优先回收包含垃圾最多区块。这也是为什么G1命名为Garbage First的原因:第一时间处理垃圾最多的区块。

    2、G1相对于CMS的区别:

    1. G1在压缩空间方面有优势
    2. G1通过将内存空间分成区域(Region)的方式避免内存碎片问题
    3. Eden, Survivor, Old区不再固定、在内存使用效率上来说更灵活
    4. G1可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应用雪崩现象
    5. G1在回收内存后会马上同时做合并空闲内存的工作、而CMS默认是在STW(stop the world)的时候做
    6. G1会在Young GC中使用、而CMS只能在O区使用

    3、G1的使用场景:

    1. 服务端多核CPU、JVM内存占用较大的应用(至少大于4G)
    2. 应用在运行过程中会产生大量内存碎片、需要经常压缩空间
    3. 想要更可控、可预期的GC停顿周期;防止高并发下应用雪崩现象。
  • 相关阅读:
    docker删除常见命令
    测试网中用户添加docker yum源
    kafka 重新分配partition
    docker-compose常用命令
    docker 常用命令
    docker-compose部署ELK
    ELK全Dokcer 部署
    Harbor修改/data目录位置
    单机多es容器服务部署的网络模式
    C++使用模板类时出现LNK2019 unresolved external symbol错误.
  • 原文地址:https://www.cnblogs.com/takemyjavalisfe/p/10334950.html
Copyright © 2011-2022 走看看