【JVM】【 GC】G1理论初探

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不会,因为内存没有连在一起存储;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值