`

JVM垃圾回收机制总结(4) :新一代的垃圾回收算法

阅读更多

全文转载: http://pengjiaheng.iteye.com/blog/548472

作者: 和你在一起 (from JavaEye)

 

 

 

垃圾回收的瓶颈

    传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是Full GC所带来的应用暂停。在一些对实时性要求很高的应用场景下,GC暂停所带来的请求堆积和请求失败是无法接受的。这类应用可能要求请求的返回时间在几百甚 至几十毫秒以内,如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限制在一个相对较小范围内,但是这样有限制了应用本身的处理能力,同样也是不可 接收的。

    分代垃圾回收方式确实也考虑了实时性要求而提供了并发回收器,支持最大暂停时间的设置,但是受限于分代垃圾回收的内存划分模型,其效果也不是很理想。

    为了达到实时性的要求(其实Java语言最初的设计也是在嵌入式系统上的),一种新垃圾回收方式呼之欲出,它既支持短的暂停时间,又支持大的内存空间分配。可以很好的解决传统分代方式带来的问题。

 

 

增量收集的演进

    增量收集的方式在理论上可以解决传统分代方式带来的问题。增量收集把对堆空间划分成一系列内存块,使用时,先使用其中一部分(不会全部用完),垃圾收集时 把之前用掉的部分中的存活对象再放到后面没有用的空间中,这样可以实现一直边使用边收集的效果,避免了传统分代方式整个使用完了再暂停的回收的情况。

    当然,传统分代收集方式也提供了并发收集,但是他有一个很致命的地方,就是把整个堆做为一个内存块,这样一方面会造成碎片(无法压缩),另一方面他的每次 收集都是对整个堆的收集,无法进行选择,在暂停时间的控制上还是很弱。而增量方式,通过内存空间的分块,恰恰可以解决上面问题。

 

 

Garbage Firest(G1)

这部分的内容主要参考这里 ,这篇文章算是对G1算法论文的解读。我也没加什么东西了。

 

 

目标

从设计目标看G1完全是为了大型应用而准备的。

支持很大的堆

高吞吐量

  --支持多CPU和垃圾回收线程

  --在主线程暂停的情况下,使用并行收集

  --在主线程运行的情况下,使用并发收集

实时目标: 可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收

当然G1要达到实时性的要求,相对传统的分代回收算法,在性能上会有一些损失。

 

 

算法详解

      G1可谓博采众家之长,力求到达一种完美。他吸取了增量收集优点,把整个堆划分为一个一个等大小的区域(region)。内存的回收和划分都以 region为单位;同时,他也吸取了CMS的特点,把这个垃圾回收过程分为几个阶段,分散一个垃圾回收过程;而且,G1也认同分代垃圾回收的思想,认为 不同对象的生命周期不同,可以采取不同收集方式,因此,它也支持分代的垃圾回收。为了达到对回收时间的可预计性,G1在扫描了region以后,对其中的 活跃对象的大小进行排序,首先会收集那些活跃对象小的region,以便快速回收空间(要复制的活跃对象少了),因为活跃对象小,里面可以认为多数都是垃 圾,所以这种方式被称为Garbage First(G1)的垃圾回收算法,即:垃圾优先的回收。

 

 

回收步骤:

 

初始标记(Initial Marking)

    G1对于每个region都保存了两个标识用的bitmap,一个为previous marking bitmap,一个为next marking bitmap,bitmap中包含了一个bit的地址信息来指向对象的起始点。

    开始Initial Marking之前,首先并发的清空next marking bitmap,然后停止所有应用线程,并扫描标识出每个region中root可直接访问到的对象,将region中top的值放入next top at mark start(TAMS)中,之后恢复所有应用线程。

    触发这个步骤执行的条件为:

    G1定义了一个JVM Heap大小的百分比的阀值,称为h,另外还有一个H,H的值为(1-h)*Heap Size,目前这个h的值是固定的,后续G1也许会将其改为动态的,根据jvm的运行情况来动态的调整,在分代方式下,G1还定义了一个u以及soft limit,soft limit的值为H-u*Heap Size,当Heap中使用的内存超过了soft limit值时,就会在一次clean up执行完毕后在应用允许的GC暂停时间范围内尽快的执行此步骤;

    在pure方式下,G1将marking与clean up组成一个环,以便clean up能充分的使用marking的信息,当clean up开始回收时,首先回收能够带来最多内存空间的regions,当经过多次的clean up,回收到没多少空间的regions时,G1重新初始化一个新的marking与clean up构成的环。

 

并发标记(Concurrent Marking)

    按照之前Initial Marking扫描到的对象进行遍历,以识别这些对象的下层对象的活跃状态,对于在此期间应用线程并发修改的对象的以来关系则记录到remembered set logs中,新创建的对象则放入比top值更高的地址区间中,这些新创建的对象默认状态即为活跃的,同时修改top值。

 

 

最终标记暂停(Final Marking Pause)

    当应用线程的remembered set logs未满时,是不会放入filled RS buffers中的,在这样的情况下,这些remebered set logs中记录的card的修改就会被更新了,因此需要这一步,这一步要做的就是把应用线程中存在的remembered set logs的内容进行处理,并相应的修改remembered sets,这一步需要暂停应用,并行的运行。

 

 

存活对象计算及清除(Live Data Counting and Cleanup)

    值得注意的是,在G1中,并不是说Final Marking Pause执行完了,就肯定执行Cleanup这步的,由于这步需要暂停应用,G1为了能够达到准实时的要求,需要根据用户指定的最大的GC造成的暂停时间来合理的规划什么时候执行Cleanup,另外还有几种情况也是会触发这个步骤的执行的:

    G1采用的是复制方法来进行收集,必须保证每次的”to space”的空间都是够的,因此G1采取的策略是当已经使用的内存空间达到了H时,就执行Cleanup这个步骤;

    对于full-young和partially-young的分代模式的G1而言,则还有情况会触发Cleanup的执行,full-young模式下,G1根据应用可接受的暂停时间、回收young regions需要消耗的时间来估算出一个yound regions的数量值,当JVM中分配对象的young regions的数量达到此值时,Cleanup就会执行;partially-young模式下,则会尽量频繁的在应用可接受的暂停时间范围内执行Cleanup,并最大限度的去执行non-young regions的Cleanup。

 

分享到:
评论

相关推荐

    jvm垃圾回收机制总结

    总结,理解JVM的垃圾回收机制对于优化Java应用程序的性能至关重要。开发者应根据应用的特性和需求,选择合适的垃圾回收器,并通过调整相关参数,以达到最佳的系统性能。同时,编写代码时也要遵循良好的内存管理实践...

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

    4. G1(Garbage-First):新一代的垃圾收集器,目标是实现可预测的暂停时间模型。 四、垃圾回收调优 1. 参数调整:例如-Xms和-Xmx设置堆大小,-XX:NewRatio设置新生代和老年代的比例,-XX:SurvivorRatio设定新生代...

    JVM 垃圾回收(GC)

    理解JVM垃圾回收机制对于优化Java应用性能至关重要。 1. **垃圾回收的基本概念** - **对象生命周期**:在Java中,对象的生命周期包括创建、使用和销毁。当对象不再被引用时,就被认为是“垃圾”。 - **垃圾回收器...

    JVM调优总结(4)分代垃圾回收Java开发Java经验技

    4. G1(Garbage-First):新一代垃圾回收器,目标是实现可预测的暂停时间模型,适用于大内存应用。 四、JVM调优参数 理解并正确设置JVM参数对于优化垃圾回收至关重要,例如: - `-Xms` 和 `-Xmx`:设置堆内存的初始...

    JVM内存管理和垃圾回收

    Java虚拟机(JVM)是Java程序运行的基础,它的内存管理与垃圾回收机制对于程序的性能至关重要。在Java中,内存分为堆内存、栈内存、方法区、程序计数器和本地方法栈五个主要区域。下面我们将深入探讨这些区域以及...

    JVM之垃圾回收器

    本篇文章将深入探讨JVM中的垃圾回收机制及其各种回收器。 1. **基本概念** - **内存区域划分**:JVM内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器...

    垃圾回收机制文件打包

    9. **G1垃圾收集器**:G1是JDK 1.6引入的新一代垃圾收集器,目标是实现低暂停时间并能预测垃圾回收时间。它将堆划分为多个Region,并采用并发标记和增量式压缩策略。 10. **Java 11及以后的ZGC和Shenandoah**:这两...

    JVM垃圾回收及监控优化1

    总之,理解JVM的内存管理和垃圾回收机制对于解决内存溢出问题、提升系统并发性能至关重要。开发者需要深入理解不同GC算法的原理和特点,结合实际应用需求,进行合理的配置和调优,确保应用稳定、高效地运行。

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

    Java虚拟机(JVM)中的垃圾回收器(Garbage Collector, GC)是Java程序自动管理内存的关键组件。垃圾回收器负责识别不再使用的对象并回收它们所占用的内存,以防止内存泄漏并确保程序的稳定运行。理解不同类型的垃圾...

    JVM调优总结.pdf

    此外,文档还提到了新一代垃圾回收算法,例如G1垃圾回收器,它旨在解决之前算法的一些限制,比如暂停时间过长的问题。 最后,文档强调了调优方法的重要性,并提出了反思,即在进行JVM调优时需要根据应用的实际需求...

    Java 垃圾回收小结(一)

    总结起来,Java的垃圾回收机制是其内存管理的关键,通过各种GC类型和算法确保内存的有效利用。NIO作为高效I/O模型,有助于提升整体系统性能,并与垃圾回收相互作用,共同维护Java应用的稳定性和性能。了解并熟练掌握...

    java垃圾回收器代码举例

    - **可达性分析**:垃圾回收器通过一系列称为“根”(如局部变量、静态变量和JVM栈中的对象引用)的对象,来判断哪些对象是可达的,哪些是不可达的。不可达的对象被视为垃圾。 - **标记-清除算法**:这是最基础的...

    Java垃圾回收知识,垃圾回收资料

    - **G1(Garbage-First)GC**:新一代垃圾收集器,目标是可预测的暂停时间模型。 5. **GC调优** 调整垃圾收集器参数,如新生代与老年代的比例、堆大小、GC频率等,可以优化性能。工具如VisualVM、JConsole等帮助...

    Java学习笔记_垃圾回收

    4. G1(Garbage-First):新一代的垃圾回收器,目标是达到可预测的暂停时间。 六、调优与实践 1. 参数调整:JVM提供了丰富的参数供开发者调整垃圾回收策略,例如`-Xms`、`-Xmx`控制堆大小,`-XX:+UseG1GC`选择G1...

    JVM性能调优-JVM内存整理及GC回收.pdf_java_jvm_

    本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来提升应用性能。 一、JVM内存结构 JVM内存主要分为以下几个区域: 1. **堆内存(Heap Memory)**:这是Java对象的主要存储场所,分为年轻代和老年代...

    深入JVM内核—原理、诊断与优化视频教程-4.GC算法与种类

    4. **G1(Garbage-First)**:新一代的垃圾收集器,目标是实现可预测的暂停时间模型,适用于大型应用。 五、GC调优 理解并优化GC是提升Java应用性能的关键。调优包括调整堆大小、设置新生代与老年代的比例、选择...

    第6节: GC垃圾回收-02

    ### **垃圾回收算法** #### 1. 引用计数法 此算法简单,但无法处理对象之间相互引用的情况,因此在现代JVM中很少使用。 #### 2. 根搜索算法(可达性分析) 这是Hotspot JVM采用的算法,通过从一系列称为“GC Roots...

Global site tag (gtag.js) - Google Analytics