JVM垃圾收集器与STW

什么是STW(stop the world)?

STW是垃圾回收过程中将JVM内存冻结、停顿的一种状态,在没有STW的情况下,会出现两种现象:

  • 该回收的对象没有被回收
  • 不该回收的对象被回收了
    这都是因为垃圾收集过程中,用户线程也在执行而导致的,所以在STW状态下,除垃圾收集线程外其它线程都会停止工作。
    STW是不可避免的,垃圾收集算法一定会产生STW,最好的解决方案就是降低停顿时间,并且GC的各种算法优化重点也是为了减少STW,这也是JVM调优的重点。
    在这里插入图片描述
    垃圾收集器就是垃圾收集的具体实现。

Serial

Serial垃圾收集器是一种单线程垃圾收集器,Serial垃圾收集器进行垃圾回收时会暂停其它线程,采用的是“标记-复制”算法,运行在Client模式下的虚拟机默认的新生代垃圾收集器。
在这里插入图片描述

Serial Old

Serial Old垃圾收集器是Serial垃圾收集器的老年代版本,也是一个单线程的垃圾收集器,只不过采用的算法是“标记-整理”算法,其它与Serial一致。

ParNew

ParNew垃圾收集器就是Serial的多线程版本,多CPU情况下,效率比Serial垃圾收集器效率高,单CPU情况下比Serial垃圾收集器差,采用“标记-复制”算法,是运行在Server模式下的虚拟机首选的新生代垃圾收集器。
在这里插入图片描述

Parallel Scavenge

Parallel Scavenge垃圾收集器也是一种多线程的新生代垃圾收集器,采用“标记-复制”算法,比起ParNew垃圾收集器,更关注系统吞吐量。

Parallel Old

Parallel Old垃圾收集器时Parallel Scavenge收集器的老年代版本,采用“标记-整理”算法,也是更关注系统吞吐量。

CMS

CMS(Concurrent Mark Sweep)垃圾收集器是一种以获取系统最短停顿时间为目的的垃圾收集器,采用“标记-清除”算法。整体收集过程分为4步:
(1)初始标记:标记GC Roots直接关联对象
(2)并发标记:标记GC Roots遍历的存活对象
(3)重新标记:修改并发标记因为用户程序变动的对象
(4)并发清除:清除不可达的对象,同时如果有新垃圾产生,留着下次清理(称为浮动垃圾)
由于存在并发标记和并发清除,收集器线程和用户线程是一起工作的,所以CMS垃圾收集器回收过程是与用户线程一起并发执行的,由于是并发收集,所以停顿时间短,但是会产生大量的空间碎片,并且并发阶段会降低系统吞吐量。
在这里插入图片描述

G1(Garbage-First)

使用G1垃圾收集器时,Java堆会划分成为多个大小相等的独立区域Region,新生代老年代不再是物理隔离,而是一部分Region的集合。如果要放入的对象太大,超过了Region的50%,那么就会直接放到H区域中,而G1垃圾收集器,会优先收集垃圾最多的Region。

(1)G1采用的是分代收集,保留了分代的概念;
(2)G1会进行空间整合,整体上还是“标记-整理”算法,不会产生空间碎片;
(3)G1可以设置垃圾收集的时间,保证G1垃圾收集不会超过设置的时间。

在这里插入图片描述
G1垃圾收集过程:
(1)初始标记:标记GC Roots直接关联对象,会暂停用户线程
(2)并发标记:标记GC Roots遍历的存活对象,与用户线程并发执行
(3)最终标记:修正在并发阶段因为用户程序并发执行变动的数据,会暂停用户线程
(4)筛选回收:对各个Regison的回收成本和代价进行排序,按照用户指定的GC停顿时间执行回收计划。

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值