JVM 的GC回收算法----G1

        JVM内存垃圾回收目前有多种算法,每种算法都有自己的特点和使用场景,本文主要介绍一下G1(Garbage-First)算法.G1是一款面向服务端应用的垃圾回收器,是SUN公司在JDK1.7中提出来的,初衷是替换JDK1.5中的CMS垃圾回收算法。G1之前的所有收集器都是对整个新生代或老年代进行垃圾回收,而G1不是这样:G1是将整个堆空间分成许多个大小不等的独立区域(Region),大约有2000块,每个Region从1M到32M大小不等,在JVM启动的时候就已经分割好了,Region可采用并行的垃圾回收或 NOT STW 方式。如下图所示:

Region被分成了Eden、survivor和旧生代Region。除此之外,其实还有第四类——大Region。此部分区域用来存放超过标准Region大小的50%或者更大的对象,此部分在内存中是连续的。不过oracle没有对这一部分的gc操作进行优化,不建议大家使用大Region。


1.G1发生young GC 

     a、内存中新建的对象占用一个或者多个的survivor Region。如果对象的生存期达到了阈值,对象就会被转移到旧生代Region中,如下图所示:


      

发生young GC 的时候,会发生STW 的停顿。survivor 和Eden Region会为下次young GC进行计算,计算过程中会结合设置的一些参数(如: -XX:MaxGCPauseMillis=10   -XX:GCPauseIntervalMillis=200等

b、发生youngGC后,继续存活的对象被放到了survivor或旧生代中


引用原文对young GC进行summery:

  • The heap is a single memory space split into regions.
  • (堆空间是独立的一块内存空间,被分成了多个块)
  • Young generation memory is composed of a set of non-contiguous regions. This makes it easy to resize when needed.
  • (新生代由一系列不连续的regions组成,这样有利于按需分配内存大小)
  • Young generation garbage collections, or young GCs, are stop the world events. All application threads are stopped for the operation.
  • (发生youngGC的时候是STW事件,所有的应用线程都会被停止)
  • The young GC is done in parallel using multiple threads.
  • (多线程并发实现young GC)
  • Live objects are copied to new survivor or old generation regions.
  • young GC后的存活的对象被复制到了新的survivor或旧生代中

2.G1发生Old GC 


大体步骤如下:初始标记——根区扫描——并发标记——重新标记——清除回收——对象复制

下面对各个步骤稍作说明,

a. 初始标记   此过程会发生STW,标记指向旧生代对象的suvivor Region。

b.根区扫描   此过程与应用并发执行,扫描指向旧生代对象的suvivor Region,但是扫描必须在young GC之前完成。

c.并发标记  此过程与应用并发执行,查找整个堆上存活的对象,此过程可以被young GC 打断

d.重新标记  此过程会发生STW,此过程中采用起始快照算法(snapshot-at-the-beginning,SATB),该算法比CMS的收集器算法快许多。

e.清楚回收  此过程部分阶段会发生STW。1.统计存活和完全空闲的region(发生STW)2.修改标记列表(发生STW)3.重置空闲Region并标记到空闲列表上(与应用并发)

f.复制   此过程发生STW。复制存活的对象到未使用的Region上,此过程在youngGC中也会发生。youngGC 发生日志中标记为GC pause (young),young GC和old GC同时发生的时候,日志中标记为GC Pause (mixed).如下图:





 本文部分图片来源于官网。如有对这方面感兴趣的同学,欢迎扫描下方二维码关注公众号“微IT之blog”

                                                              


猜你喜欢

转载自blog.csdn.net/jerry_player/article/details/79417736