垃圾收集器之G1

Garbage First(G1) 垃圾优先
在这里插入图片描述
g1把堆分成了很多块,每一块可能被定义成年轻代,或者年老代

首先,G1的设计原则就是简单可行的性能调优
开发人员仅仅需要声明以下参数即可:

指令意义
-XX:+UseG1GC开启G1垃圾收集器
-Xmx32g设计堆内存的最大内存为32G
-XX:MaxGCPauseMillis=200设置GC的最大暂停时间为200ms

需要调优,在内存大小一定的情况下,我们只需要修改最大暂停时间即可。(可预测停顿:消耗在垃圾收集器上得时间不会超过多少)

其次,G1将新生代,老年代的物理空间划分取消了。

并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿的时间,部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。
分代收集:与其他收集器一样,分代概念在G1中依然得以保留。虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。

空间整合:与CMS的“标记—清理”算法不同,G1从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个Region之间)上来看是基于“复制”算法实现的,但无论如何,这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。这种特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。

内存布局:在G1之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1不再是这样。使用G1收集器时,Java堆的内存布局就与其他收集器有很大差别,== 它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合== 新生代GC回收Eden区和survivor区,回收后,所有eden区被清空,存在一个survivor区保存了部分数据。老年代区域会增多,因为部分新生代的对象会晋升到老年代。
并发标记周期
初始标记:短暂,仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,产生一个全局停顿,都伴随有一次新生代的GC。
根区域扫描:扫描survivor区可以直接到达的老年代区域。
并发标记阶段:扫描和查找整个堆的存活对象,并标记。
重新标记:会产生全局停顿,对并发标记阶段的结果进行修正(因为并发标记阶段会产生垃圾)。
独占清理:会产生全局停顿,对GC回收比例进行排序,供混合收集阶段使用并发清理:识别并清理完全空闲的区域,并发进行混合收集 对含有垃圾比例较高的Region进行回收。G1当出现内存不足的的情况,也可能进行的FullGC回收。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值