回收器类型+G1回收器概念

回收器类型+G1回收器概念

在这里插入图片描述

一:串行收集器:

开启:-XX:+SerialGC

串行收集器组合 Serial + Serial Old

串行收集器采用单线程stop-the-world的方式进行收集。当内存不足时,串行GC设置停顿标识,待所有线程都进入安全点(Safepoint)时,应用线程暂停,串行GC开始工作,采用单线程方式回收空间并整理内存。串行收集器特别适合堆内存不高、单核甚至双核CPU的场合

二:并行收集器

开启: -XX:+UseParallelGC(java 8默认开启的这种)

并行收集器组合 Parallel Scavenge + Parallel Old

并行收集器与串行收集器工作模式相似,都是stop-the-world方式,只是暂停时并行地进行垃圾收集。年轻代采用复制算法,老年代采用标记-整理,在回收的同时还会对内存进行压缩。关注吞吐量主要指年轻代的Parallel Scavenge收集器,通过两个目标参数-XX:MaxGCPauseMills和-XX:GCTimeRatio,调整新生代空间大小,来降低GC触发的频率。并行收集器适合对吞吐量要求远远高于延迟要求的场景,并且在满足最差延时的情况下,并行收集器将提供最佳的吞吐量。

三:并发标记清除收集器

开启: -XX:+UseConcMarkSweepGC  (cms)

并发标记清除收集器组合 ParNew + CMS + Serial Old

年轻代使用STW式的并行收集,老年代回收采用CMS进行垃圾回收

年轻代ParNew与并行收集器类似,而老年代CMS每个收集周期都要经历:初始标记、并发标记、重新标记、并发清除。其中,初始标记以STW的方式标记所有的根对象;并发标记则同应用线程一起并行,标记出根对象的可达路径;在进行垃圾回收前,CMS再以一个STW进行重新标记,标记那些由mutator线程(指引起数据变化的线程,即应用线程)修改而可能错过的可达对象;最后得到的不可达对象将在并发清除阶段进行回收。值得注意的是,初始标记和重新标记都已优化为多线程执行。CMS非常适合堆内存大、CPU核数多的服务器端应用,也是G1出现之前大型应用的首选收集器。

缺点:
1.cms 与应用程序并行,增加堆内存占用。cms需要在老年代用完之前gc,不然触发担保机制,stop the world 串行执行老年代垃圾收集,会停顿较久

2.Cms是标记清除,无法整理碎片空间,随时间推移,老年代会被消耗完,解决办法,-XX:CMSFullGCsBeForeCompaction (默认为0) 指定多少次cms 后触发一次full gc 压缩空间。

四:Garbage First(G1)

开启:-XX:+UseG1GC

前提:G1也有类似CMS的收集动作:初始标记、并发标记、重新标记、清除、转移回收,并且也以一个串行收集器做担保机制

模型:

在这里插入图片描述

card记忆集作用解决young gc 的老年代指向新生代的可达性问题):
用记忆集来记录外部指向本region对象的所有引用,每个Region都维护一个记忆集

注意点:
1.G1的设计原则是"首先收集尽可能多的垃圾(Garbage First)"。因此,G1并不会等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是在内部采用了启发式算法,在老年代找出具有高收集收益的分区进行收集。同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;

2.G1采用内存分区(Region)的思路,将内存划分为一个个相等大小的内存分区,回收时则以分区为单位进行回收,存活的对象复制到另一个空闲分区中。由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩);

3.G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor(to space)堆做复制准备。G1只有逻辑上的分代概念,或者说每个分区都可能随G1的运行在不同代之间前后切换;

4.G1的收集都是STW的,但年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集),这样即使堆内存很大时,也可以限制收集范围,从而降低停顿。

对象运行分配:
在这里插入图片描述

大型对象
当分配的对象大于等于Region的一半时,就可以认为它是大对象了,同时因为大对象可能占用好几个Region,最后一个Region可能占不满,有剩余空间,这个空间按照GUIDE那篇文章来说是lost的,也就是忽略它,它不会被其他对象使用,也不会被回收。

原始快照:记录了删除的引用,防止第二次可达性标记误删对象

young GC

在jvm正常运行时,创建的新对象会放在Eden的Region里,当Eden中装满了不能再分配了,就会将Eden区域存活的对象给复制到Survivor的Region去,年龄够的对象会被复制到老年代(一般经过一次垃圾回收之后的对象年龄+1,超过一定阈值就可以被判定为老年代,或者是Survivor区域装不下了,也会被判定为是老年代)

Mixed GC

1.并发标记阶段:
该阶段细分为大概4个步骤:

  • 初始标记(initial mark):标记从GC Roots开始直接可达的对象。该阶段借用了young GC的暂停,利用youngGC的STW时间短,完成初始标记,这种方式称为借道。该过程没有STW。

  • 并发标记(concurrent mark):和用户线程一起并发工作,在可达性树上进行扫描,确认对象们的存活状态。

  • 重新标记(remark):将在并发标记中被用户修改引用关系的对象重新扫描,避免出现并发可达性分析的安全问题。这里采用的是上面讲到的原始快照。同时,G1执行全局引用处理和类卸载,在这一阶段,G1根据已有信息,计算各个Region回收的效益的期望。该阶段STW。

  • 清除垃圾(cleanup):该阶段会整理堆分区,将回收效益高的Region放入Collect
    Set中去,然后识别空闲分区,将无存活对象的Region直接回收。该阶段也是STW的。

2.最终回收阶段(Evacuation):
该阶段是STW的,将Collect Set中的Region中的存活对象拷贝到其他空的Region中去,然后收回原本的Region所占用的内存空间。

G1:设定实战
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=60

具体参数
G1和cms区别
各收集器解释

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值