JVM垃圾收集器

JVM垃圾收集器

2020年4月27日

15:19

  • Serial收集器(复制算法,新生代)
    • 单线程收集器
    • 优点:简单高效(与其他收集器的单线程相比)
      • 因为是单线程,没有线程交互的开销,对运行在Client模式下的虚拟机是很好的选择
    • 缺点:工作时必须暂停其它所有线程(Stop The World)
  • ParNew收集器(并行多线程)
    • 新生代采用复制算法,老年代标记-整理算法
    • Serial收集器的多线程版本,除了Serial收集器外只有它能与CMS收集器配合工作
    • 默认开启的收集线程和CPU一样多,可以使用-XX:ParallelGCThreads参数限制线程数
  • Parallel Scavenge收集器(并行多线程)
    • 新生代收集器,复制算法
    • 目标:达到一个可控制的吞吐量(吞吐量=代码运行的时间/(代码运行时间+垃圾收集时间))
    • 吞吐量越高则高效率的利用CPU时间,更快的完成程序运算任务
    • 适用场景:后台运算,不需要太多与用户交互的任务
  • Serial Old收集器(串行,老年代)
    • 老年代收集器,标记整理算法
  • Parallel Old收集器(并行)
    • 老年代收集器,标记整理
  • CMS收集器(并发收集,低停顿)
    • 老年代收集器
    • 标记清除算法
    • 默认启动现场数:(CPU数量+3)/4
    • 运行过程:
      • 1.初始标记 需要“Stop The World”,标记GC Roots能直接关联的对象,速度快
      • 2.并发标记 从GC Roots开始对堆中的对象进行可达性分析,找出存活的对象
      • 3.重新标记 需要“Stop The World”,用于修改程序运作而发生的标记变动
      • 4.并发清除
    • 缺点:
      • 1、会占用一部分线程(或者CPU资源)而导致程序变慢,总吞吐量降低
      • 2、无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败导致另一次Full GC产生
        • 浮动垃圾:CMS和用户线程并发执行,CMS无法收集到新产生的垃圾,只好下一次GC清理,新产生的垃圾就是浮动垃圾
      • 3、因为是标记清除的,所以会产生大量空间碎片
        • 解决:
          • 1.CMS提供了一个-XX:UseCMSCompactAtFullCollection开关参数(默认开启)
            • 作用:CMS顶不住要Full GC时开启内存碎片的合并整理。停顿时间会变长
          • 2.另一个参数:-XX:CMSFullGCsBeforeCompaction
            • 作用:用于设置执行多少次不压缩的Full GC后,跟着来一次带压缩的(默认值0,表示每次进入Full GC时都进行碎片整理)
  • G1收集器
    • 从整体看G1基于“标记-整理算法”,从局部看“复制算法”
    • 特点:
      • 1.并行与并发
      • 2.分代收集
      • 3.空间整合,不会产生内存空间碎片
      • 4.可预测停顿,能指定消耗在垃圾收集上的时间不得超过N毫秒
    • 运作过程:
      • 1.初始标记:仅仅标记一下GC Roots能直接关联到的对象
      • 2.并发标记:从GC Roots开始对堆中的对象进行可达性分析,找出存活的对象
      • 3.最终标记:用于修正程序运作而发生的标记变动记录,会把变动的部分记录在线程Remembered Set Logs里面,然后把Remembered Set Logs里的数据合并到Remembered Set中
      • 4.筛选回收: 对各个Region的回收价值和成本进行排序,根据用户期望的GC停顿时间制定回收计划
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值