晋中美食:G1垃圾接纳器

admin 7个月前 (04-11) 科技 45 0

垃圾接纳器的生长历程

靠山

01、G1解决的问题

G1垃圾接纳器是04年正式提出,12最先正式支持,在17年作为JDK9默认的垃圾处理器。

04年的时刻,java程序堆的内存越来越大,从而导致程序中可存活的活工具越来越多,因此GCSTW时间越来越长。这是G1要解决的主要问题:STW带来的停留时间太长了

CMS在此之前效率也很高,但活工具数目一多,STW时间也很长。而且CMS无法解决内存碎片化的问题。

G1还解决的问题是:CMSGC后,无法compact内存。

02、G1杀青的目的

(1)削减由于STW而带来的程序延迟时间,做到伪实时、低延时、可设定目的;
可设定目的是指能够设置GC最大STW停留的时间,G1会只管杀青目的,但不一定杀青。

-XX:MaxGCPauseMillis=N

默认情况下是250毫秒

(2)解决CMSGC后,无法压缩程序内存的问题;

(3)在JDK9之后,默认的垃圾处理器就是G1;它适用于堆内存较大的情况下(>4~6G);

G1垃圾接纳器

一、G1内存结构

G1不再遵照之前的堆中工具的分代排列,而是将堆分成若干个等大的区域。

而是酿成:
晋中美食:G1垃圾接纳器 第1张

默认是分成2048个区域,-XX:G1HeapRegionSize=N 2048

Humongous:当你分配的一个工具跨越一半区域的大小时,这个工具就会被放入这个区域。这个区域属于老年月区域。

二、G1的先容

G1垃圾接纳器不再接纳整个堆,而是选择一个Collection SetCS)。而且每次GC时,会估量每个Region中的垃圾比例,优先接纳垃圾多的Region。这就为什么被叫做Garbage First算法。这也是为什么G1可以控制STW停留时间的缘故原由。
G1含有三种GC算法:

  • Full young GC:年轻代GC算法:STWParallelCopying
  • 老年月GC算法:Mostly-concurrent markingIncremental compaction
  • Mixed GC:夹杂GC

三、G1引来的问题

问题形貌

G1将年轻代、老年月区域划分为许多个小区域,增加在GC判断工具是否为垃圾的难度。好比:

  • 老年月工具可能持有年月代的引用(跨代引用)
  • 差别的Region间的相互引用
    晋中美食:G1垃圾接纳器 第2张

假设在Full young GC时,某个年轻代Region工具可能被老年月的某个工具引用,那么我在接纳这个年轻代Region时,怎么知道这里面的工具是否被其他Region、老年月引用呢?

问题解决

Remembered SetCard Table
晋中美食:G1垃圾接纳器 第3张

1、CardTable
每个Region中分为许多区域,每个区域我们成为CardTable,对应的就是上述蓝色区域;每个CardTable有多个entry组成。当对应的内存空间发生改变时,就会符号为dirty

2、RememberedSet
Region1CardTable引用Region2CardTable时,Region2RememberedSet就会纪录对应CardTable中的entry,可以凭据其找到对应的内存区域。

3、剖析
当某个内存对应举行赋值是,就是工具的set方式,我们可以在这种方式上添加dirty的形貌。
这实在就是典型的时间换空间的做法:用分外的空间维护引用信息,这就是占用5~10%的过多内存占用。

解决方式的实现

1、Write Barrier先容
Write barrier是一种向JVM注入的一小段代码,用于纪录指针转变。好比说object.field = <reference>

JVM最先更新指针时,就经由以下几步:

  • 符号CardDirty
  • Card存入Dirty Card Queue行列中

这里有一个问题:为什么要放在行列里,而不是直接去更新RememberedSet呢?
这是由于JVM运行可能会有多个线程并行的修改RememberedSet,这样就需要破费分外的时间来解决多线程同步问题。而这种更新引用是频仍的,以是这种分外时间是无法忍受的。

2、Dirty Card Queue
这个行列有白、绿、黄、红四个颜色,示意应用线程往这个行列放义务的状态。

  • White
    示意没有应用线程往行列里放义务,什么事都不用干。

  • Green
    此时Refinement线程最先被激活,最先更新RS-XX:G1ConcRefinementGreenZone=N

  • Yellow
    此时所有的Refinement线程都被激活,来更新RS-XX:G1ConcRefinementYellowZone=N

  • Red
    这个时刻,应用线程也最先介入排空行列的事情。-XX:G1ConcRefinementRedZone=N

四、GC算法的历程

1、Fully young GC

GC的历程

(1)STW
此时会暂停所有堆中的工具,将部门Region拷贝到指定区域。
晋中美食:G1垃圾接纳器 第4张

(2)构建Collection Set
fully young GC就是选取所有的EdenSurvivor

(3)扫描GC Roots

(4)更新RememberedSet
排空Dirty Card Queue

(5)Process RS
凭据RS找到要GC的工具被哪些工具引用了。

(6)工具拷贝
survivor区域工具的调整。

(7)Reference Processing

分外会做的事

G1纪录每个阶段的时间,用于后期自动调优。好比说会纪录EdenSurvivor的数目和GC时间,后期会凭据我们之前设定的暂停目的来自动调整Region数目。
然则我们设置暂停目的越短,年轻代的Region数目就越少。但这可能会导致Fully young GC频仍发生。

2、Old GC

当堆用量到达一定水平时,就会触发old GC。可以通过以下参数举行设置:

-XX:InitatingHeapOccpancyPercent=45

old GC有一个很大特点就是并发举行的。但它是如何在堆中不停转变的情况下,确定哪些是要清算的垃圾工具呢?

三色符号算法

这种算法实现了在不暂停应用线程的情况下举行并发符号,符号历程过如下:
(1)将GC Root工具纪录为玄色,其直接引用工具纪录为灰色,并将这些灰色工具放入一个行列中
晋中美食:G1垃圾接纳器 第5张
(2)从行列取出工具,将其标为玄色,将其引用工具纪录为灰色,再放入行列中
晋中美食:G1垃圾接纳器 第6张
(3)直到行列中无工具为止
晋中美食:G1垃圾接纳器 第7张

三色符号算法的瑕玷:Lost Object Problem

三色符号算法并没有完全将所有的活工具都符号出来,这就是Lost Object Problem问题。好比说:
(1)刚最先时

晋中美食:G1垃圾接纳器 第8张

(2)在即将形貌将C标为灰色的一刹那

晋中美食:G1垃圾接纳器 第9张

此时,C依然是活工具,然则已经无法将其符号了。

(3)效果

晋中美食:G1垃圾接纳器 第10张

Lost Object Problem的解决

这种解决办法照样通过Write barrier手艺来解决。当B.c=null,也就是C指针被删除时,G1照样被以为活工具。

那若是C是新生工具呢?这是老年月GC

Old GC历程

(1)STW
老年月GC会在这个时刻,举行一次Fully young GC

(2)恢复应用线程

(3)使用三色符号算法并发符号(init marking

(4)STW

这时刻会有一个Remark阶段,主要是解决SATBReference processing
还会有一个Cleanup阶段,用于接纳全为空的区

(5)恢复应用线程

3、Mixed GC

我们直到CMS最大的瑕玷就是无法举行压缩操作,而G1就通过Mixed GC解决了这个问题。

Mixed GC没有牢固触发条件,他是凭据Fully young GC网络的信息和我们设置的时间来决议,是否触发Mixed GC。它会凭据暂停目的,来优先选择垃圾最多的Old Region来执行。

Mixed GC会选择若干个Region举行,默认是选择1/8Old RegionEden RegionSurvivor Region

Mixed GC的历程跟Fully young GC的历程相同,都是:STWParallelCopying

原博客地址

,

sunbet手机版官网下载

欢迎进入sunbet手机版官网下载!Sunbet 申博提供申博开户(sunbet开户)、SunbetAPP下载、Sunbet客户端下载、Sunbet代理合作等业务。

皇冠APP声明:该文看法仅代表作者自己,与本平台无关。转载请注明:晋中美食:G1垃圾接纳器

网友评论

  • (*)

最新评论

标签列表

    文章归档

    站点信息

    • 文章总数:530
    • 页面总数:0
    • 分类总数:8
    • 标签总数:893
    • 评论总数:151
    • 浏览总数:9270