【JVM】垃圾回收器

垃圾回收器

Serial收集器

单线程,进行垃圾收集工作时必须暂停其他所有的工作线程。STW造成了不好的用户体验。

STW: Stop-The-World: 是在垃圾回收算法执⾏过程当中,将JVM内存冻结、应用程序停顿的⼀种状态。

新生代采用复制算法,老年代采用标记整理算法。

在这里插入图片描述

Serial Old

Serial 收集器的老年代版本,它同样是一个单线程收集器。它主要有两大用途:一种用途是在 JDK1.5 以及以前的版本中与 Parallel Scavenge 收集器搭配使用,另一种用途是作为 CMS 收集器的后备方案。

ParNew收集器

常用作客户端的首选垃圾回收器,Serial的多线程版本。

为缩短STW,采用多线程GC,只负责新生代垃圾回收,可以配合cms和serial old。

弊端:需多核cpu才能发挥优势。
在这里插入图片描述

Parallel Scavenge收集器

新生代垃圾回收器,标记-复制算法的多线程收集器。Parallel Scavenge关注点是吞吐量,CMS等垃圾收集器关注点更多的是用户线程的停顿时间。

为了达到目的牺牲了新生代(调小了新生代),调小之后填满的频率提高了。通过 -XX:UseAdaptiveSizePolicy参数,可以根据当前系统运行情况调整。

在这里插入图片描述

Parallel old

多线程和标记整理算法,采用多线程标记整理算法来收集老年代。常用ps+po。

CMS收集器

Concurrent Mark Swap,并发收集低停顿。

浮动垃圾难清楚,只能等到下一次。cms要预留空间给用户线程,老年代不能填满。

一种以获取最短回收停顿时间为目标的收集器,实现了让垃圾收集线程与用户线程(基本上)同时工作,注重用户体验的应用上使用。

执行过程

  • 初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;

  • 并发标记: 同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。

  • 重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短

  • 并发清除: 开启用户线程,同时 GC 线程开始对未标记的区域做清扫。

G1收集器

全年代的垃圾回收器。Garbage first

堆空间切成大小相等的Region,默认2048(max),每个region属于新生代或老年代(动态变化),代不连续。

新生代垃圾回收的时机是当新生代region数量扩充到了60%的时候,复制算法垃圾回收。

面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备多吞吐量性能特征。

总结

串行回收器:Serial,Serial old;
并行回收器:ParNew,Parallel scavenge,Parallel old;
并发回收器:CMS、G1;

新生代收集器:Serial,ParNew,Parallel scavenge;
老年代收集器:Serial old,Parallel old, CMS;
整堆收集器:G1;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值