`
youyu4
  • 浏览: 435417 次
社区版块
存档分类
最新评论

JVM之G1垃圾回收器

 
阅读更多

JVM之G1垃圾回收器

 

G1垃圾收集器采用的是区域化、分布式的垃圾回收器。堆被划分成 许多个连续的区域(region)。每个区域大小相等,在1M~32M之间。JVM最多支持2000个区域,可推算G1能支持的最大内存为2000*32M=62.5G。区域(region)的大小在JVM初始化的时候决定,也可以用-XX:G1HeapReginSize设置。

 

虽然在G1收集器里面将整个内存区域都混合在了一起,但是其本身依然也是在小范围内要进行年轻代与老年代的区分,也就是说依然会采用不同的GC方式来处理不同的区域。

 

 

 

内存占用

 

如果从 ParallelOldGC 或者 CMS收集器迁移到 G1, 您可能会看到JVM进程占用更多的内存(a larger JVM process size). 这在很大程度上与 “accounting” 数据结构有关, 如 Remembered Sets 和 Collection Sets.

 

Remembered Sets

简称 RSets, 跟踪指向某个heap区内的对象引用. 堆内存中的每个区都有一个 RSet. RSet 使heap区能并行独立地进行垃圾集合. RSets的总体影响小于5%。


Collection Sets

简称 CSets, 收集集合, 在一次GC中将执行垃圾回收的heap区. GC时在CSet中的所有存活数据(live data)都会被转移(复制/移动). 集合中的heap区可以是 Eden, survivor, 和/或 old generation. CSets所占用的JVM内存小于1%。

 

 

 

适用场景

 

G1的首要目标是为需要大量内存的系统提供一个保证GC低延迟的解决方案. 也就是说堆内存在6GB及以上,稳定和可预测的暂停时间小于0.5秒。

 

如果应用程序具有如下的一个或多个特征,那么将垃圾收集器从CMS或ParallelOldGC切换到G1将会大大提升性能。

 

  • Full GC 次数太频繁或者消耗时间太长
  • 对象分配的频率或代数提升(promotion)显著变化
  • 受够了太长的垃圾回收或内存整理时间(超过0.5~1秒)

注意: 如果正在使用CMS或ParallelOldGC,而应用程序的垃圾收集停顿时间并不长,那么继续使用现在的垃圾收集器是个好主意. 使用最新的JDK时并不要求切换到G1收集器。

 

 

 

年轻代垃圾回收

 

  • 堆一整块内存空间,被分为多个heap区(regions)
  • 年轻代内存由一组不连续的heap区组成. 这使得在需要时很容易进行容量调整
  • 年轻代的垃圾收集,或者叫 young GCs, 会有 stop the world 事件. 在操作时所有的应用程序线程都会被暂停(stopped)
  • 年轻代 GC 通过多线程并行进行
  • 存活的对象被拷贝到新的 survivor 区或者老年代

 

垃圾回收前

 

垃圾回收后


 

 

 

 

老年代垃圾回收

 

       和 CMS 收集器相似, G1 收集器也被设计为用来对老年代的对象进行低延迟(low pause)的垃圾收集. 下表描述了G1收集器在老年代进行垃圾回收的各个阶段

 



 

 

 

 

 

 

 

 

 

老年代垃圾回收的几个关键点

 

1. 并发标记清理阶段(Concurrent Marking Phase)
  • 活跃度信息在程序运行的时候被并行计算出来
  • 活跃度(liveness)信息标识出哪些区域在转移暂停期间最适合回收.
  • 不像CMS一样有清理阶段(sweeping phase).

2. 再次标记阶段(Remark Phase)

  • 使用的 Snapshot-at-the-Beginning (SATB, 开始快照) 算法比起 CMS所用的算法要快得多.
  • 完全空的区域直接被回收.

3. 拷贝/清理阶段(Copying/Cleanup Phase)

  • 年轻代与老年代同时进行回收.
  • 老年代的选择基于其活跃度(liveness).

 

 

相关参数



 
 例子:

 java -Xmx10m -Xms10m -XX:+UseG1GC -XX:+PrintGCDetails TestDemo

 

 

 

总结

 

G1处理和传统的垃圾收集策略是不同的,关键的因素是它将所有的内存进行了子区域的划分。

 

 

 

CMS和G1的比较

 

1. CMS用标记——清除算法,G1用标记——整理算法。CMS容易出现内存碎片,G1不会,所以CMS回收完垃圾后要压缩内存,可以配置。不然可能因为碎片太多,大片内存不够导致Full GC,还有可能导致切换到备用的老年代垃圾回收器Serial Old。

 

2. CMS只能回收老年代,G1可以回收整个堆,因为G1有分代回收的配置。

 

3. CMS使用并发回收,所以不会导致用户停顿,但是对CPU非常敏感,所以回收时会占用一部分线程,使应用变慢,总吞吐量降低。G1用了并行收集和并发收集,发挥了多个CPU的优势,可以非常精确地控制停顿时间,而且不牺牲吞吐量。

 

 

 

  • 大小: 134.2 KB
  • 大小: 132.8 KB
  • 大小: 136.1 KB
  • 大小: 107.7 KB
  • 大小: 123.6 KB
  • 大小: 113.5 KB
  • 大小: 141.9 KB
  • 大小: 126.8 KB
  • 大小: 357.5 KB
  • 大小: 81.6 KB
  • 大小: 41.3 KB
  • 大小: 73.7 KB
分享到:
评论

相关推荐

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构;...七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old、G1 JVM调优:命令行指令,设置堆内存大小的参数

    JVM垃圾回收机制与GC性能调优

    Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS(Current Mark Sweep)收集器 1.6G1收集器 第六节:JVM参数调优 1.1 JVM重要参数介绍...

    jvm内存模型以及垃圾回收机制.pptx

    Java虚拟机(JVM)内存模型和垃圾回收机制是Java开发中至关重要的概念。本文将深入探讨这两个主题,帮助理解JVM如何管理...开发者应根据实际需求选择合适的垃圾回收器,并关注内存分配策略,以实现高效稳定的程序运行。

    JVM的垃圾回收机制详解和调优

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收(Garbage Collection,简称GC)。GC是JVM自动管理内存的主要方式,它负责识别并清理不再使用的对象,以避免内存泄漏和资源浪费。理解并...

    JVM之基本的垃圾回收算法汇总

    7. G1垃圾回收器 G1是Oracle JDK 1.6引入的一种新的垃圾回收器,它结合了分代、并发和空间整理的特性,目标是实现可预测的暂停时间模型。G1将堆划分为多个大小固定的区域,并尝试预测每个GC周期的暂停时间,从而满足...

    G1垃圾回收器论文【免积分下载】

    ### G1垃圾回收器知识点详解 #### 一、引言 随着Java编程语言在大型服务器应用中的广泛应用,垃圾回收机制成为保障系统稳定性和性能的关键因素之一。这些应用通常具有大量活跃堆内存数据以及显著的线程级并行性,...

    JVM之垃圾回收器

    **JVM之垃圾回收器** Java虚拟机(JVM)是Java编程语言的核心组成部分,它负责执行字节码并管理程序运行时的内存。在JVM的内存模型中,垃圾回收(Garbage Collection, GC)是一项重要的功能,它自动识别并清理不再...

    JVM结构+垃圾回收器+锁总结.xmind

    JVM结构+垃圾回收器+锁总结

    深入理解JVM&G1; GC

    2. ** Region划分**:通过Region划分,使得GC可以更灵活地进行局部或全局的垃圾回收。 3. **暂停预测**:G1能够预测每次GC的停顿时间,从而让开发者可以设定一个期望的停顿目标。 4. **空间整合**:G1在回收垃圾时...

    JVM历史发展和内存回收笔记

    6. **Java 7与G1 GC**:2011年,Java 7引入了G1(Garbage First)垃圾回收器,它是一种并行、并发且具有低延迟特性的垃圾回收器,适用于大型应用。 7. **Java 8与元空间**:2014年,Java 8中,永久代被元空间...

    JVM中[垃圾回收器]的所有内容-pdf

    JVM的默认配置会随着JDK版本的更新而变化,例如,从JDK 9开始,G1成为默认的垃圾回收器。 了解GC的性能指标,如吞吐量(运行用户代码的时间占比)、暂停时间、收集频率和内存占用,可以帮助开发者根据应用需求调整...

    JVM垃圾回收器和内存分配策略.zip

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收器(Garbage Collector, GC),以及内存分配策略。理解这些概念对于优化Java应用性能至关重要。本篇文章将深入探讨JVM的垃圾回收机制以及...

    JVM&g1gc;带书签,完整版本

    **JVM(Java Virtual Machine)与G1垃圾收集器** JVM,全称为Java虚拟机,是Java程序的运行环境,它将Java源代码编译成字节码,然后解释执行这些字节码,实现了“一次编写,到处运行”的目标。JVM的主要任务包括...

    jvm垃圾回收机制总结

    4. 分区算法:G1和ZGC等垃圾回收器采用,将堆划分为多个大小固定的区域,便于并发回收和减少碎片。 四、垃圾回收参数调整 JVM提供了丰富的参数来调整垃圾回收行为,如`-Xms`和`-Xmx`设置堆内存大小,`-XX:NewRatio...

    JVM内存管理和垃圾回收

    - **G1(Garbage-First)GC**:新一代的垃圾回收器,目标是预测并控制垃圾回收的停顿时间。 理解JVM内存管理和垃圾回收机制对于优化Java应用程序性能至关重要,开发者可以通过调整JVM参数来定制适合应用需求的内存...

    深入理解JVM & G1 GC

    《深入理解JVM & G1 GC》这篇文章和相关压缩包文件主要聚焦于Java虚拟机(JVM)的内存管理,特别是垃圾收集器(GC)的优化,特别是G1(Garbage-First)垃圾收集器的深度解析。下面将详细阐述JVM、GC的基本概念,...

    jvm内存模型以及垃圾回收机制.rar

    JVM的垃圾回收器有多种,如串行GC(Serial GC)、并行GC(Parallel GC)、并发标记扫描GC(CMS, Concurrent Mark Sweep)和G1垃圾收集器等。选择合适的垃圾回收器取决于应用的需求,例如,对于响应时间敏感的应用,...

Global site tag (gtag.js) - Google Analytics