JVM GC ——G1理论初探
1 region
G1将内存区域分为了n个不连续的,大小相同的Region,Region具体的大小为1到32M
可以动态的设置region的大小java -jar -gcregion_size
2 g1中的三种区域
- Eden(新生区):存放除了H-obj的正常数据
- Survivor(幸存区):当Eden区满时,还存活的对象将被复制到Survivor区
- Old(老年代):存放两类数据:经历了N次(maxTenuring Threshold == N,有的默认为15)垃圾回收后仍然存活的对象。第二类是H-obj
tip: 一般来说,垃圾回收后仍然存活的条件:数据被引用
3 巨大变量H-obj
G1还划分出了Humongous区域,用来存放巨大对象(humongous object,H-obj)
- 定义: >= region的数据
- H-obj产生的情况:一般出现在字符串上(序列化时可能产生),但是一个class会拆开存储。
tip:对象动态年龄计算规则 虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuring Threshold(默认15次)才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。
H-obj直接分配到Old gen,(就是为了避免变量复制(超过15次后的操作))。但是H-obj的回收却不是在Mixed GC阶段,而是concurrent marking阶段中的clean up过程和full GC
4 g1的垃圾gc机制
-
Yong GC:当Eden数据满了,只回收部分年轻代的内存
-
Mixed GC: 回收所有年轻代内存和部分老年代内存: 经历垃圾回收的次数(会被标记)超过MaxTenuring Threshold,会触发mixed gc
global concurrent marking: 并发标记。用来做标记,从而找到可以被回收的数据(没有引用计数)。(只有没被引用时,变量才可以被回收)
-
serial old GC(full GC):来收集整个GC heap, 所有内存都清空.Mixed GC实在无法跟上程序分配内存的速度,导致老年代填满无法继续进行Mixed GC
tip: h-object allocation: 满了时候,会触发普通gc, 来扩大h-object的内存。(4:6-1:9)
tip: 数组可能会产生巨大变量,但是list不会,因为内存没有连在一起存储;