• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

JVM七大垃圾回收器

武飞扬头像
Autunomy
帮助10

垃圾回收的过程

  1. 新生成的对象首先放到Eden区,当Eden区满了会触发Minor GC
  2. 第一步活下来的对象会被移动到survivor区中的S0区,S0区满了之后会触发Minor GC,S0区存活下来的对象会被移动到S1区,S0区空闲

S1满了之后再GC存活下来的再次移动到S0区,S1区空闲,这样反反复复GC,每GC一次,对象的年龄就长一岁,达到某个值后,就会进入老年代

  1. 在发生一次Minor GC后,老年代可能出现Major GC,这个视垃圾回收器而定

Full GC触发的条件

  • 手动调用System.gc,会不断的执行Full GC
  • 老年代空间不足/满了
  • 方法区空间不足/满了

STW:stop the world,会在所有的GC算法中发生,stop-the-world 意味着JVM因为需要执行GC而停止应用程序的执行。

TLAB内存

TLAB全称是Thread Local Allocation Buffer即线程本地分配缓存,从名字上看是一个线程专用的内存分配区域,是为了加速对象分配而生的。

每一个线程都会产生一个TLAB,该线程独享的工作区域,java虚拟机使用这种TLAB区来避免多线程冲突问题,提高了对象分配的效率。

TLAB空间一般不会太大,当大对象无法在TLAB分配时,则会直接分配到堆上。

垃圾回收器

学新通

新生代可配置的回收器:Serial、ParNew、Parallel Scavenge

老年代配置的回收器:CMS、Serial Old、Parallel Old

新生代和老年代区域的回收器之间进行连线,说明他们之间可以搭配使用。

新生代垃圾回收器

Serial垃圾回收器

Serial收集器是最基本的、发展历史最悠久的收集器。俗称为:串行回收器,采用复制算法进行垃圾回收

特点

串行回收器是指使用单线程进行垃圾回收的回收器。每次回收时,串行回收器只有一个工作线程。

对于并行能力较弱的单CPU计算机来说,串行回收器的专注性和独占性往往有更好的性能表现。

它存在Stop The World问题,及垃圾回收时,要停止程序的运行。

使用-XX: UseSerialGC参数可以设置新生代使用这个串行回收器

ParNew垃圾回收器

ParNew其实就是Serial的多线程版本,除了使用多线程之外,其余参数和Serial一模一样。俗称:并行垃圾回收器,采用复制算法进行垃圾回收

特点

ParNew默认开启的线程数与CPU数量相同,在CPU核数很多的机器上,可以通过参数-XX:ParallelGCThreads来设置线程数。

它是目前新生代首选的垃圾回收器,因为除了ParNew之外,它是唯一个一个地个能与老年代CMS配合工作的。

它同样存在Stop The World问题

使用-XX: UseParNewGC参数可以设置新生代使用这个并行回收器

ParallelGC回收器

ParallelGC使用复制算法回收垃圾,也是多线程的。

特点

就是非常关注系统的吞吐量,吞吐量=代码运行时间/(代码运行时间 垃圾收集时间)

-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间,可用把虚拟机在GC停顿的时间控制在MaxGCPauseMillis范围内,如果希望减少GC停顿时间可以将MaxGCPauseMillis设置的很小,但是会导致GC频繁,从而增加了GC的总时间,降低了吞吐量。所以需要根据实际情况设置该值。

-Xx:GCTimeRatio:设置吞吐量大小,它是一个0到100之间的整数,默认情况下他的取值是99,那么系统将花费不超过1/(1 n)的时间用于垃圾回收,也就是1/(1 99)=1%的时间。

另外还可以指定-XX: UseAdaptiveSizePolicy打开自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。

使用-XX: UseParallelGC参数可以设置新生代使用这个并行回收器

老年代垃圾回收器

SerialOld垃圾回收器

SerialOld是Serial回收器的老年代回收器版本,它同样是一个单线程回收器。

用途

  • 一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,
  • 另一个就是作为CMS收集器的后备预案,如果CMS出现Concurrent Mode Failure,则SerialOld将作为后备收集器。

使用算法:标记 - 整理算法

ParallelOldGC垃圾回收器

老年代ParallelOldGC回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关注吞吐量的回收器,他使用了标记压缩算法进行实现。

-XX: UseParallelOldGc进行设置老年代使用该回收器

-XX: ParallelGCThreads也可以设置垃圾收集时的线程数量。

CMS回收器

CMS全称为:Concurrent Mark Sweep意为并发标记清除,他使用的是标记清除法。主要关注系统停顿时间。

使用-XX: UseConcMarkSweepGC进行设置老年代使用该回收器。

使用-XX:ConcGCThreads设置并发线程数量。

特点

CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS的过程中应该确保应用程序的内存足够可用。

CMS不会等到应用程序饱和的时候才去回收垃圾,而是在某一阀值的时候开始回收,回收阀值可用指定的参数进行配置:-XX:CMSInitiatingoccupancyFraction来指定,默认为68,也就是说当老年代的空间使用率达到68%的时候,会执行CMS回收。

如果内存使用率增长的很快,在CMS执行的过程中,已经出现了内存不足的情况,此时CMS回收就会失败,虚拟机将启动老年代串行回收器;SerialOldGC进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。

这个过程GC的停顿时间可能较长,所以-XX:CMSInitiatingoccupancyFraction的设置要根据实际的情况。

标记清除法有个缺点就是存在内存碎片的问题,那么CMS有个参数设置-XX: UseCMSCompactAtFullCollecion可以使CMS回收完成之后进行一次碎片整理。

-XX:CMSFullGCsBeforeCompaction参数可以设置进行多少次CMS回收之后,对内存进行一次压缩。

执行过程:

1.初始标记 停止一切用户线程,因使用一条初始标记线程对所有与GC Roots关联的对象进行标记。

2.并发标记 使用多条并发标记线程并行执行,并与用户线程并发执行。此过程进行可达性分析,标记出所有废弃的对象,速度很慢。

3.重新标记 使用多条线程并行执行,将刚才并发过程中新出现的废弃对象标出来。

4.并发清除 使用一条并发清除线程,和业务线程并发执行,清除无用对象,这个过程非常耗时。

G1回收器

可以回收新生代也可以回收老年代

G1 全称 Garbage-First 是一种面向服务器的垃圾回收器,通过将堆内存划分为多个 Region 来实现可预测的停顿时间模型。在 G1 当中,新生代和老年代已经不再是物理隔离,而都是被划分一个个 Region 区域。正是由于这种可预测的时间停顿模型让 G1 成为了一个高吞吐量的垃圾回收器。G1 能充分利用 CPU,多核环境下可以缩短 STW 的时间。

  1. 初始标记:通过可达性分析标记 GC Roots 的直接关联对象,这个阶段与 CMS 一样需要 STW;
  2. 并发标记:并发标记是通过 GC Roots 找到存活的对象,这个阶段 GC 线程是与用户线程同时运行的,并且这个阶段的时间比初始标记长;
  3. 最终标记:最终标记跟 CMS 的重新标记一样,也是为了修正并发标记过程中因用户线程继续运行而导致产生新的引用更新;同样的这里也需要 STW;
  4. 筛选回收:筛选回收这里会对每个 Region 的回收成本进行排序,根据用户期望的停顿时间来制定收回计划,这也就是可预测的停顿时间模型的体现之处,这个阶段 GC 线程是与用户线程同时运行的。

特点

  1. CMS因为并发引起的问题G1同样也存在,但是G1可以避免因为Mark-Sweep算法引起的内存不连续问题。
  2. G1由于可以在用户指定时间范围内进行垃圾回收,所以具备软实时的特性。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhaaee
系列文章
更多 icon
同类精品
更多 icon
继续加载