三分钟简单了解垃圾收集器之G1垃圾收集器

本文旨在 快速了解 G1垃圾收集器是什么,有什么特色原理是什么,经常使用的配置参数有哪些,与CMS垃圾收集器相比有什么优点算法

废话不bb,正文开始!并发


1、G1 是什么

  • G1 是一种面向服务端的垃圾收集器,应用在多核处理器和大容量内存环境中,在实现高吞吐量的同时,尽量的知足垃圾收集器的暂停时间要求。性能

  • 像 CMS 收集器同样,能与应用程序线程并发执行。spa

    整理空闲空间更快,
      须要更多的时间来预测 GC 停顿时间,
      不但愿牺牲大量的吞吐性能,不须要更大的 JAVA Heap。
    复制代码
  • G1 收集器的设计目的是取代 CMS 收集器。线程

    G1 垃圾收集器是一个有整理内存过程的垃圾收集器,不会产生不少内存碎片。
      G1 的 Stop The World 更可控,G1 在停顿上添加了预测机制,用户能够指按期望的停顿时间。
    复制代码
  • G1 是在 2012 年才在 jdk.1.7u4 中能够呀用,在 jdk9 中将 G1 变成默认垃圾收集器来代替 CMS。它是一款面向服务应用的收集器。设计

    主要改变是 Eden、Survivor 和 Tenured 等内存区域再也不是连续的,而是变成了一个个大小同样的 region
       每一个 region 从 1M 到 32M 不等,一个 region 有可能属于 Eden、Survivor 或者 Tenured 内存区域。
    复制代码

2、特色

  • G1 能充分利用多 CPU、多核环境硬件优点,尽可能缩短 STW。
  • G1 总体采用标记-整理算法,局部是经过是经过复制算法,不会产生内存碎片。
  • 宏观上看 G1 之中再也不区分年轻代和老年代,被内存划分为多个独立的子区域。
  • G1 收集器里面讲整个的内存区域混合在一块儿,但其自己依然在小范围内要进行年轻代和老年代的区分。保留了新生代和老年代,但她们不在是物理隔离,而是一部分 Region 的集合且不须要 Region 是连续的,也就是说依然会采用不一样的 GC 方式来处理不一样的区域。
  • G1 虽然也是分代收集器,但整个内存分区不存在物理上的年轻代和老年代的区别,也不须要彻底独立的 Survivor to space 堆作复制准备。G1 只有逻辑上的分代概念,或者说每一个分区均可能随 G1 的运行在不一样代之间先后切换。

3、底层原理

一、Region 区域化垃圾收集器:最大好处是化整为零,避免全内存扫描,只须要按照区域来进行扫描便可。code

二、回收步骤,四步过程:cdn

初始标记:标记一下GC Roots能直接关联到的对象,须要停顿线程,但耗时很短
 并发标记:是从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行
 最终标记:修正在并发标记期间因用户程序继续运做而致使标记产生变更的那一部分标记记录
 筛选回收:对各个Region的回收价值和成本进行排序,根据用户所指望的GC停顿时间来制定回收计划
复制代码

4、经常使用配置参数:

-XX:UseG1GC对象

-XX:G1HeapRegionSize=n:设置G1区域的大小,值是2的幂blog

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

5、与CMS相比的优点

没有内存碎片 能够精确控制停顿

相关文章
相关标签/搜索