JVM学习笔记——垃圾回收篇( 五 )

垃圾回收器前面我们已经介绍了垃圾回收机制,现在我们来介绍常用的垃圾回收器
STW概念我们在正式讲解垃圾回收器之前,我们先来回顾一个概念STW:

  • STW即Stop The World,意思是暂停所有进程处理
  • 因为我们在进行垃圾处理时,会涉及到地址空间的整合(标记整理法) , 这时所有CPU都需要停止操作
串行垃圾回收器我们首先来介绍串行垃圾回收器的特点:
  • 单线程
  • 适用于堆内存较小,适合单人电脑
我们给出串行垃圾回收器的展示图:
JVM学习笔记——垃圾回收篇

文章插图
我们所需配置:
// 设置 新生代回收方法复制 老年代回收方法为标记整理法-XX:+UseSerialGC = Serial + SerialOld我们来简单解释一下:
  • 串行操作属于单核CPU处理
  • 我们在处理该CPU的垃圾回收时,只有该线程的CPU进行操作
  • 但同时老年代采用标记整理法会涉及到内存地址重新规划 , 所以其他CPU也需要暂停操作,即STW
吞吐量优先垃圾回收器我们首先来介绍吞吐量优先垃圾回收器的特点:
  • 多线程
  • 适用于堆内存较大,需要多核CPU
  • 让单位时间内,STW时间最短,例如每次STW0.2秒 , 但执行两次,共用0.4s(总时间最短)
我们给出吞吐量优先垃圾回收器的展示图:
JVM学习笔记——垃圾回收篇

文章插图
我们所需配置:
// 设置垃圾回收器方法XX:+UseParallelGC ~ -XX:+UseParallelOldGC// 自适应新生代晋升老年代的阈值处理-XX:+UseAdaptiveSizePolicy// 设置垃圾回收时间占总时间的比例(与-XX:MaxGCPauseMillis=ms冲突)-XX:GCTimeRatio=ratio// 设置最大STW时间(与-XX:GCTimeRatio=ratio冲突)-XX:MaxGCPauseMillis=ms// 设置最大同时进行CPU个数-XX:ParallelGCThreads=n我们来简单解释一下:
  • 吞吐量优先垃圾回收器是多核CPU处理回收器
  • 当一个进程发生垃圾回收时,我们会将所有CPU都用于垃圾回收 , 这时CPU利用率为100%
响应时间优先垃圾回收器我们首先来介绍响应时间优先垃圾回收器的特点:
  • 多线程
  • 适用于堆内存较大,需要多核CPU
  • 让单次STW时间最短,例如每次STW0.1秒,但执行五次,共用0.5s(单次时间最短)
我们给出响应时间优先垃圾回收器的展示图:
JVM学习笔记——垃圾回收篇

文章插图
我们所需配置:
// +UseConcMarkSweepGC:设置并发标记清除算法 , 允许用户进程单独进行,但部分时间还需要阻塞// -XX:+UseParNewGC:设置新生代算法,// SerialOld:当老年代并发失败,采用单线程方法-XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld// -XX:ParallelGCThreads=n:并行数设置为n// -XX:ConcGCThreads=threads:并发线程最好设置为CPU的1/4个数 , 相当于只有1/4个CPU在处理垃圾回收-XX:ParallelGCThreads=n ~ -XX:ConcGCThreads=threads// 预留空间(因为并发清理时其他进程可能会产生一些垃圾,这些垃圾目前无法处理,我们需要预留一定空间进行储存)-XX:CMSInitiatingOccupancyFraction=percent// 我们在重新标记阶段前,先对新生代进行垃圾回收,节省其标记量-XX:+CMSScavengeBeforeRemark我们来简单解释一下:
  • 响应时间优先垃圾回收器是多核CPU处理回收器
  • 首先我们的CPU1进行初始标记 , 其他进程阻塞,仅标记一些Root对象(时间短)
  • 然后我们CPU1进行并发标记,其他进程继续运行,这时用来标记所有的垃圾回收对象(时间长)
  • 然后由于我们的并发标记可能会导致一些内存混乱 , 所以我们将所有CPU需要进行重新标记(时间短)
  • 最后只需要对CPU1进行并发清理即可 , 其他进程继续运行
G1垃圾回收器下面我们将会针对jdk1.9默认垃圾回收器做一个详细的介绍
G1垃圾回收器简介首先我们先来简单介绍一下G1垃圾回收器:
  • G1回收器:Garbage First
  • 在2017成为JDK9的默认垃圾回收器
下面我们来介绍G1垃圾回收器的特点:
  • 同时注重吞吐量和低延迟,默认的暂停目标是200ms
  • 超大堆内存,将堆划分为多个大小相等的Region
  • 整体上是标记整理法,但两个区域之间是复制算法
相关JVM参数: