Java中常见的垃圾收集器

串行垃圾回收器(Serial 收集器)

单线程的垃圾回收器,在垃圾回收时,需要其它线程暂停,等待垃圾回收完毕。

开启串行垃圾回收器的参数:-XX:+UseSerialGC = serial + serialOld

  • serial是工作在新生代,采用的是复制算法;

  • serialOld是工作在老年代,采用的是标记整理算法。

请添加图片描述

缺点:STW时间较长

优点:简单又高效,没有线程交互的消耗,收集效率高。

吞吐量优先垃圾回收器

多线程的垃圾回收器,注重的是单位时间内垃圾回收的STW时间最短。需要多核CPU支持,是和在服务器中 使用。

开启吞吐量优先垃圾回收器的参数:-XX:+Use Parallel GC ~ -XX:+Use Parallel Old GC

(Parallel:并行的)在JDK8是默认开启了这两个开关。当你手动开启其中一个开关,另一个也会默认开启。

  • ParallelGC 是工作在新生代,采用的是复制算法;

  • ParallelOldGC 是工作在老年代,采用的是标记整理算法。

优点:单位STW时间较短

缺点:垃圾回收时,CPU占用率过高

请添加图片描述

响应时间优先垃圾回收器

多线程的的垃圾回收器,注重的是尽可能让单次垃圾回收中STW的时间最短,在垃圾回收时,不需要其它线程暂停,可以和其它用户线程并发(concurrent)执行是多个线程和垃圾回收线程抢占CPU。

开启响应时间优先垃圾回收器的参数:-XX: +UseConcMarkSweepGC~-XX: +UseParNewGC~ Serial0ld

  • CMS GC是工作在老年代的,使用标记清除算法的GC。

  • PN GC是工作在新生代的,使用复制算法的GC

优点:并发收集、低停顿

缺点:垃圾回收占用了一整个线程,整个程序的吞吐量降低。会产生内存碎片。

请添加图片描述

**CMS垃圾回收器的工作步骤:**暂停两次,标记三次

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

  • 并发标记: 同时开启 GC 和用户线程,跟踪记录发生引用更新的对象。

  • 重新标记: 重新标记产生变化的那部分对象。

  • 并发清除: 线程恢复运行,并发清理每个线程的垃圾。

G1(Garbage First)收集器

G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 同时注重吞吐量(Throughput) 和低延迟(Low latency) .

整体上是标记+整理算法,两个区域之间是使用复制算法

超大堆内存,会将堆划分为多个大小相等的区域Region(每个区都有自己新生代和老年代)

开启G1垃圾回收器的参数:- XX: +UseG1GC 在JDK9之前需要手动启用G1回收

  • 初始标记:在Young GC时会进行GC Root的初始标记

  • 并发标记:老年代占用堆空间比例达到阈值时,进行并发标记(不会STW),JVM参数决定

    -XX:InitiatingHeapOccupancyPercent = percent (默认45%)

  • 最终标记:对E、S、O区域进行全面垃圾回收,会STW

  • 筛选回收

具体的回收步骤:

将E区和S区的无用对象进行回收,有用对象进行复制算法到一个新的S区。

将符合晋升阈值的对象加入到老年代中。

当现有的O区中内存已满,就会根据暂停时间,在暂停时间内,有选择的将O区中的对象复制到新的O区中。(优先回收能释放出更多内存的区域,所以叫做Garbage First

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值