JVM垃圾回收模型-(垃圾回收器①)

98 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

JVM垃圾回收模型-垃圾回收器

GC的种类

  • Scavenge GC (Minor GC):对新生代,触发时机是在新对象生成时,Eden空间满了,理论上Eden区大多数对象会在 Scavenge GC回收,复制算法的执行效率会很高, Scavenge GC时间比较短。
  • Full GC:对整个JVM进行整理,包括 Young、Old和Perm(永久代,jdk8没有,jdk为元空间),主要的触发时机:1)Old满了2)Perm满了3) system.gc() Full GC的执行效率很低,尽量减少 Full GC

分代模型是GC的宏观愿景,垃圾回收器是GC的具体实现,hotspot jvm提供多种垃圾回收器,我们需要根据具体的应用采用多种垃圾回收器

垃圾回收器的并行(Parallel)和并发(Concurrent),并行指的是多个收集器的线程同时工作,但是用户线程处于等待状态;并发指的是收集器在工作的同时,可以允许用户线程工作,但是并发并不代表解决了GC的停顿问题,在关键步骤该停顿的还是要停顿,比如在收集器标记垃圾的时候,但是在清除垃圾的时候用户线程可以和GC线程并发执行

2.1 serial 收集器

  • 是最早的收集器,单线程收集器,Hotspot Client模式缺省的收集器,收集时会暂停所有工作线程(Stop The World,简称STW),因为是单线程GC,没有多线程切换的额外开销,简单实用
  • New和 Old Generation都可以使用在新生代,采用复制算法,在老年代,采用Mark-Compact算法;

2.2 Serial Old 收集器

​ Serial Old是单线程收集器,使用标记一整理算法, 是老年代的收集器

2.3 parnew收集器

  • Parnew收集器就是Serial收集器在新生代的多线程版本,是Server模式下新生代的缺省收集器,除了使用多个收集线程外,其余行为包括算法、STW、对象分配规则、回收策略等都与 Serial收集器一模一样。
  • 使用复制算法(因为针对新生代,效率比较高);
  • 只有在多CPU的环境下,效率才会比 Serial收集器高;
  • 可以通过-XX: Parallelg Cthreads来控制GC线程数的多少,需要结合具体CPU的个数;

2.4 Parallel Scavenge收集器

Parallel Scavenge 收集器也是一个多线程收集器(Parallel就是并行的意思),也是使用复制算法,但它的对象分配规则与回收策略都与 Parnew收集器有所不同,它是以吞吐量最大化(即GC时间占总运行时间最小)为目标的收集器实现,它允许较长时间的STW换取总吞吐量最大化,jvm1.8默认在新生代使用Parallel Scavenge ,老年代使用Parallel Old收集

2.5 Parallel Old 收集器

JVM1.6提供,在此之前,新生代使用PS收集器的话,老年代除了使用Serial Old外别无选择,因为PS无法和CMS配合工作。jvm1.8默认在新生代使用Parallel Scavenge ,老年代使用Parallel Old收集

  • Parallel Scavenge在老年代的实现;
  • 采用多线程,Mark-Compact算法;
  • 更注重吞吐量Parallel Scavenge+ Parallel Old = 高吞吐量,但GC停顿可能不理想

2.6 CMS收集器

CMS是一种以最短停顿时间为目标的老年代收集器,使用CMS并不能达到GC效率最高(总的GC时间最小),但是它能尽可能降低服务的停顿时间

  • 只针对老年区,一般在新生代结合Parnew使用
  • CMS收集器使用的是标记--清除算法
  • 使用-XX:+ UseConcMarkSweepGC打开