关于java:jvm-G1收集器

7次阅读

共计 1187 个字符,预计需要花费 3 分钟才能阅读完成。

参考官网

Region

应用 G1 收集器时,java 堆的内存会划分为多个大小相等的独立区域(Region),他也有新生代和老年代的概念,然而新生代和老年代不再是物理隔离的,它们都是一部分 Region(不须要间断)的汇合,如下图所示:粉色的代表新生代,没有字母的是 eden,有 s 的是 survivor,老年代是浅蓝的 O,还有一个 H 是 humongous,也是老年代,咱们在 jvm – 堆内存调配提过,大对象间接进入老年代,这个 humongous 就是存储大对象的,也就是说如果对象内存大小大于 Region 的一半大小,那就会给一个专门的 Region 寄存,如果对象大于一个 Region 的大小,那就用多个 Region 寄存。

咱们只画了 16 个 Region,并不是说堆只调配了 16 个,在没有用 -XX:G1HeapRegionSize 去指定的状况下,默认是 2048 个,Region 的个数必须是 2 的倍数,每个 Region 的大小在 1 到 32M 之间。
新生代的大小在 5% 到 60% 之间,能够通过 -XX:G1NewSizePercent=5-XX:G1MaxNewSizePercent=60 来设置。

进展工夫模型

G1 的另外一个特点,就是建设可预测的进展工夫模型。G1 跟踪各个 Region 的回收价值,并在后盾保护一个优先列表,每次依据容许的收集工夫,优先回收价值最大的 Region,保障了在无限的工夫内获取尽可能高的收集效率,进展工夫默认 200ms,用 -XX:MaxGCPauseMillis 设置。
比方下图,第一个新生代的 Region 回收 10M 须要 5ms,第二个新生代的 Region 回收 20M 也只有 5ms,第三个新生代的 Region 回收 10M 却须要 10ms,如果指定他须要 5ms 内回收 20M 的垃圾,他会间接去回收第二个新生代的 Region,而不是回收第一个和第三个新生代的 Region。

垃圾回收

新生代回收

下面提过,新生代的内存空间最多占用 60%,当 60% 的空间用完的时候,就会触发新生代的回收。新生代的回收是用复制算法的,与之前不同的是,他会思考到进展工夫。

老年代回收

老年代回收分为:初始标记、并发标记、最终标记、混合回收。
后面三个阶段跟 jvm – CMS 收集器的后面三个相似。
混合回收,是说他并不会仅仅回收老年代的垃圾,也会回收新生代的垃圾,他会依据进展工夫,尽可能的多回收 Region。因为在进展工夫内回收的垃圾可能不会很多,所以这个阶段会进行屡次的混合回收,默认是 8 次,能够通过 -XX:G1MixedGCCountTarget 设置。
如果混合回收的时候,发现 Region 仅占有 5% 了,那他就会进行回收,不会始终回收 8 次。
混合回收的基于复制算法的,所以大对象的复制会比拟耗时,如果某个老年代的 Region 超过 85% 的对象是存活的,那他不会被回收,通过 -XX:G1MixedGCLiveThresholdPercent 设置。

正文完
 0