G1详解

G1详解

G1:被称为区域化分代式垃圾回收器

1.什么是区域化分代式:因为G1是一个并行回收器,它把堆内存分为很多不相关的区域块(Region)
(物理上是不连续的)。使用不同的Region来表示:eden区、幸存者0区、幸存者1区、old区、巨型对象
1.1.怎么实现的区域化:将内存分为大小相同不连续的Region小区块

1.2.怎么实现分代的:将每个Region小区块分别看做为:eden区、幸存者0区、幸存者1区、old区、巨型对象(需要注意的是,巨型对象的概念是会让一个大对象独占几个连续的Region区域,使其成为一个巨型的Region区块)

1.3使用的什么回收算法:G1内存的回收是一Regin作为基本单位的,每个Region区间采用的是复制算法,但整体上可看做为标记-压缩

1.4可预测的时间停顿模型:G1除了追求低停顿之外,还能建立一个可预测的时间停顿模型,能让使用者设置一个-垃圾回收时间不超过N个毫秒,它会在后台维护一个优先列表,每次根据允许的回收时间,优先回收价值最大的Region

G1垃圾回收的思想:G1有计划的避免在整个堆内存中进行全区域的垃圾收集,G1通过每次只清理一部分而不是全部Region的增量式清理来保证每次停顿时间不会太长,G1会跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需要的时间),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。这种回收方式的侧重点在于回收垃圾最大量的区间(Region),所以G1的名字:垃圾优先(Garbage First)

1.5首先介绍哪些对象可以作为GC roots的根节点
1.线程栈中的局部变量表
2.方法区中的静态属性
3.方法区的中的常量
4.本地方法栈中JNI(native修饰的方法指向的对象)
5.分代垃圾回收模型中,当回收年轻代时,老年代指向新生代的引用也可以作为GC roots根节点

1.5Remebered set 概念和作用
1.起因:因为老年代指向新生代的引用也可以作为GC roots根节点,所以为了避免对整个堆内存的全局扫描,所以引用了Remebered set 记忆集
2.具体过程
1):每个Region都对应一个Remebered set 记忆集
2):每次对象发生引用时,都会产生写屏障暂停操作,然后判断你要写入指向的对象和你是否在同一个Region里,如果不在同一个Region,那么就通过Card Table把引用记录到记忆集中
(你要引用我?等一下别动?判断是否我俩在一个房间?不在一个房间我要小本本记录一下)
3):根据G1垃圾回收思想,当我要垃圾回收时,我可以根据记忆集中的引用记录来帮助判断出优先回收的Region,同时对这个Region扫描标记时,我不需要对堆进行整个扫描,只需要以1-4根节点对象和记忆集中引用的对象作为根节点进行扫描

1.6什么情况下触发垃圾回收
1.对象分配时,当年轻代Eden区用尽时触发年轻代的GC(copy算法)
2.当堆内存占用一定的阀值时(默认45%),开始年轻代+老年代混合回收(当然也不是对整体老年代新生代回收,也是按照G1垃圾回收思想回收一部分老年代Region和年轻代Region)
1.7垃圾回收过程
1.初始标记-STW:只标记根节点直接可达的对象
2.并发标记:和应用线程同时进行,进行根可达扫描
3.再次标记:使用SATB(原始快照)算法来对并发标记产生的错误进行修正
4.独占清理-STW:根据G1回收思想,对要回收的垃圾进行排序,对优先要处理的Region进行清理

G1垃圾回收器的优缺
缺点:相对CMS,G1还不具有全方位压倒性的优势,比如在用户线程运行过程中,G1无论是为了垃圾收集产生的内存占用还是程序运行时的额外执行负载都要比CMS要高
优点:在应对大内存和多处理器时,G1表现的要比CMS要好的多,原因是G1在大内存时可以把堆内存划分为更多的Region区块,拥有了更大的吞吐量,而且G1垃圾回收的思想也有效避免的停顿的时间。
平衡点:CMS和G1的平衡点大概在于6-8G,低于6-8G,CMS有优势,反之G1优势明显

应用场景:在以下情况时,G1可能比CMS要好
1.超过50%的堆内存被活着的对象占用
2.对象分配频率或年代提升频率变化非常大
3.GC停顿时间过长

G1垃圾回收器的参数设置

  1. -xx:+UseG1FC :手动指定使用G1作为垃圾回收器
  2. -xx:G1HeapRegionSize :设置每个Region块的大小,值是2的幂,范围是1MB-32MB之间,
    目标是将堆内存划分出2048个区域。默认是堆内存的1/2000
  3. -xx:MaxGCPauseMillis :设置期望达到的最大GC停顿时间,JVM会尽力达到,但不保证达到。默认是200ms
  4. -xx:ParallelGCThread :设置STW时GC线程数的值,最多设置为8
  5. -xx:ConcGCThreads :设置并发标记的线程数 将N设置为STW时GC线程数的值的1/4左右
  6. -xx:InitiatingHeapOccupancyPercent :设置触发并发GC周期的堆占用率阀值。超过此值就会触发GC,默认是45%。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值