参考官网
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
设置。
发表回复