G1垃圾收集器

以前垃圾收集器的特点:
young区和old区是各自独立且连续的内存块
年轻代收集使用单eden区+survivor0区+survivor1区进行复制算法
老年代收集必须扫描整个老年代区域
都是以尽可能少而快速的执行GC为设计原则

描述:
G1收集器是一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求,它具有以下特性:

  1. 像CMS收集器一样,能与应用程序并发的执行
  2. 整理空闲空间更快
  3. 需要更多的时间来预测GC停顿时间
  4. 不希望牺牲大量的吞吐性能
  5. 不需要更大的java heap

和CMS比较:
G1不会产生很多内存碎片;
G1的stop the world更可控,他在停顿时间上添加了预测机制,用户可以指定期望停顿的时间

主要改变是Eden区,survivor区,tenured区等内存区域不再是连续的了,而是变成了一个个大小一样的region,每个region从1M到32M不等,一个region有可能属于Eden、survivor、tenured内存区域

特点:

  1. G1整体上采用标记-整理算法,局部是通过复制算法,不会产生内存碎片
  2. 宏观上看G1之中不再区分年轻代和老年代,把内存划分成多个独立的子区域,可以近似理解为一个为期的棋盘
  3. 但其本身依然在小范围内要进行年轻代和老年代的划分。保留了新生代和老年代,但他们不再是物理隔离的,而是一部分Region的集合,且不需要Region是连续的,也就是说依然会采用不同的GC方式来处理不同的区域
  4. G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor堆做复制准备。G1只有逻辑上的分代概念,每个分区都可能随G1的运行在不同代之间前后切换
底层原理:

Region区域化垃圾收集器:
最大的好处是避免全内存扫描,只需要按照区域来进行扫描即可
核心思想是将整个堆内存划分成大小相同的子区域Region,在启动时可以设置参数 -XX:+G1HeapRegionSize=n 指定分区大小(1MB~32MB,必须是2n),默认将整堆划分为2048个分区

这些Region一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或survivor空间
这些Region一部分包含老年代,G1收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。这意味着,在正常处理过程中,G1完成了堆的压缩(部分堆的压缩),就没有了CMS的碎片问题

在G1中,还有一种特殊的区域,叫Humongous区。如果一个对象占用的空间超过了分区荣来那个的50%以上,G1收集器就认为这是一个巨型对象,这些巨型对象默认直接会被分配在老年代,但是如果她是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响,为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象,如果一个Humongous区装不下一个巨型对象,那么G1会寻找连续的Humongous区来存储。为了能找到连续的Humongous区,有时候不得不启动Full GC

回收步骤:
youngGC:eden区耗尽时被触发。
Eden区的数据移动到survivor区,假如survivor区空间不够,Eden区数据会部分晋升到old区
survivor区的数据移动到新的survivor区,部分数据晋升到old区
最后Eden区收拾干净了,GC结束

4步:

  1. 初始标记:只标记GC Roots能直接关联到的对象(和CMS一样需要暂停所有的工作线程)
  2. 并发标记:进行GC Roots跟踪的过程(和CMS一样不需要暂停工作线程)
  3. 最终标记:修正并发标记期间,因程序运行导致标记发生变化的那一部分对象
  4. 筛选回收:根据时间来进行价值最大化回收
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM (Java Virtual Machine) G1 (Garbage-First) 垃圾收集是一种用于 Java 应用程序的垃圾收集算法。它是自JDK 7u4版本后引入的一种全新的垃圾收集。 G1垃圾收集的设计目标是为了解决传统的分代垃圾收集可能遇到的一些问题,如停顿时间长、内存碎片化等。它采用了一种基于区域的垃圾收集方式,可以将内存划分为多个大小相等的区域,每个区域可以是Eden、Survivor或Old区。 G1垃圾收集的工作原理如下: 1. 初始标记(Initial Mark):标记所有从根对象直接可达的对象。 2. 并发标记(Concurrent Mark):在并发执行程序的同时,标记那些在初始标记阶段无法访问到的对象。 3. 最终标记(Final Mark):为并发标记阶段中发生改变的对象进行最终标记。 4. 筛选回收(Live Data Counting and Evacuation):根据各个区域的回收价值来优先回收价值低的区域。 G1垃圾收集具有以下特点: - 并发执行:在执行垃圾收集过程时,尽可能减少应用程序的停顿时间。 - 分区回收:将整个堆划分为多个区域,可以根据需要优先回收垃圾较多的区域,从而避免全堆回收带来的长时间停顿。 - 内存整理:G1垃圾收集会对内存进行整理,减少内存碎片化,提高内存利用率。 需要注意的是,G1垃圾收集并不适用于所有情况。在特定的场景下,如大堆情况下的长时间运行、对延迟要求非常高的应用等,可能需要考虑其他垃圾收集的使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值