`
nbqwcnm
  • 浏览: 19401 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Garbage First介绍

    博客分类:
  • jvm
阅读更多
Garbage First介绍
本文摘自《构建高性能的大型分布式Java应用》一书,Garbage First简称G1,它的目标是要做到尽量减少GC所导致的应用暂停的时间,让应用达到准实时的效果,同时保持JVM堆空间的利用率,将作为CMS的替代者在JDK 7中闪亮登场,其最大的特色在于允许指定在某个时间段内GC所导致的应用暂停的时间最大为多少,例如在100秒内最多允许GC导致的应用暂停时间为1秒,这个特性对于准实时响应的系统而言非常的吸引人,这样就再也不用担心系统突然会暂停个两三秒了。

G1要做到这样的效果,也是有前提的,一方面是硬件环境的要求,必须是多核的CPU以及较大的内存(从规范来看,512M以上就满足条件了),另外一方面是需要接受吞吐量的稍微降低,对于实时性要求高的系统而言,这点应该是可以接受的。

为了能够达到这样的效果,G1在原有的各种GC策略上进行了吸收和改进,在G1中可以看到增量收集器和CMS的影子,但它不仅仅是吸收原有GC策略的优点,并在此基础上做出了很多的改进,简单来说,G1吸收了增量GC以及CMS的精髓,将整个jvm Heap划分为多个固定大小的region,扫描时采用Snapshot-at-the-beginning的并发marking算法(具体在后面内容详细解释)对整个heap中的region进行mark,回收时根据region中活跃对象的bytes进行排序,首先回收活跃对象bytes小以及回收耗时短(预估出来的时间)的region,回收的方法为将此region中的活跃对象复制到另外的region中,根据指定的GC所能占用的时间来估算能回收多少region,这点和以前版本的Full GC时得处理整个heap非常不同,这样就做到了能够尽量短时间的暂停应用,又能回收内存,由于这种策略在回收时首先回收的是垃圾对象所占空间最多的region,因此称为Garbage First。

看完上面对于G1策略的简短描述,并不能清楚的掌握G1,在继续详细看G1的步骤之前,必须先明白G1对于JVM Heap的改造,这些对于习惯了划分为new generation、old generation的大家来说都有不少的新意。

G1将Heap划分为多个固定大小的region,这也是G1能够实现控制GC导致的应用暂停时间的前提,region之间的对象引用通过remembered set来维护,每个region都有一个remembered set,remembered set中包含了引用当前region中对象的region的对象的pointer,由于同时应用也会造成这些region中对象的引用关系不断的发生改变,G1采用了Card Table来用于应用通知region修改remembered sets,Card Table由多个512字节的Card构成,这些Card在Card Table中以1个字节来标识,每个应用的线程都有一个关联的remembered set log,用于缓存和顺序化线程运行时造成的对于card的修改,另外,还有一个全局的filled RS buffers,当应用线程执行时修改了card后,如果造成的改变仅为同一region中的对象之间的关联,则不记录remembered set log,如造成的改变为跨region中的对象的关联,则记录到线程的remembered set log,如线程的remembered set log满了,则放入全局的filled RS buffers中,线程自身则重新创建一个新的remembered set log,remembered set本身也是一个由一堆cards构成的哈希表。

尽管G1将Heap划分为了多个region,但其默认采用的仍然是分代的方式,只是仅简单的划分为了年轻代(young)和非年轻代,这也是由于G1仍然坚信大多数新创建的对象都是不需要长的生命周期的,对于应用新创建的对象,G1将其放入标识为young的region中,对于这些region,并不记录remembered set logs,扫描时只需扫描活跃的对象,G1在分代的方式上还可更细的划分为:fully young或partially young,fully young方式暂停的时候仅处理young regions,partially同样处理所有的young regions,但它还会根据允许的GC的暂停时间来决定是否要加入其他的非young regions,G1是运行到fully-young方式还是partially young方式,外部是不能决定的,在启动时,G1采用的为fully-young方式,当G1完成一次Concurrent Marking后,则切换为partially young方式,随后G1跟踪每次回收的效率,如果回收fully-young中的regions已经可以满足内存需要的话,那么就切换回fully young方式,但当heap size的大小接近满的情况下,G1会切换到partially young方式,以保证能提供足够的内存空间给应用使用。

除了分代方式的划分外,G1还支持另外一种pure G1的方式,也就是不进行代的划分,pure方式和分代方式的具体不同在下面的具体执行步骤中进行描述。

掌握了这些概念后,继续来看G1的具体执行步骤:

1.         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)中,之后恢复所有应用线程。

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

l  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暂停时间范围内尽快的执行此步骤;

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

2.         Concurrent Marking

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

3.         Final Marking Pause

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

4.         Live Data Counting and Cleanup

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

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

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

这一步中GC线程并行的扫描所有region,计算每个region中低于next TAMS值中marked data的大小,然后根据应用所期望的GC的短延时以及G1对于region回收所需的耗时的预估,排序region,将其中活跃的对象复制到其他region中。



G1为了能够尽量的做到准实时的响应,例如估算暂停时间的算法、对于经常被引用的对象的特殊处理等,G1为了能够让GC既能够充分的回收内存,又能够尽量少的导致应用的暂停,可谓费尽心思,从G1的论文中的性能评测来看效果也是不错的,不过如果G1能允许开发人员在编写代码时指定哪些对象是不用mark的就更完美了,这对于有巨大缓存的应用而言,会有很大的帮助,G1将随JDK 6 Update 14 beta发布。
分享到:
评论

相关推荐

    Garbage-First LSM 论文

    Garbage-First is a server-style garbage collector, targeted for multi-processors with large memories, that meets a soft real-time goal with high probability, while achieving high throughput. Whole-...

    Garbage-First_garbage_collection g1垃圾免积分下载

    G1垃圾回收器论文。 Garbage-First Garbage Collection October 24-25, 2004

    Garbage First(G1)介绍

    NULL 博文链接:https://softbeta.iteye.com/blog/1562185

    GarbageFirst

    GarbageFirst Garbage Collection (java G1垃圾回收)

    G1(Garbage -First).xmind

    G1垃圾收集器的总体流程与重要算法

    Java.Performance.Companion.0133796825

    Picking up where Charlie Hunt and Binu John’s classic Java Performance left off, this book provides unprecedented detail on two powerful Java platform innovations: the Garbage First (G1) garbage ...

    Head First C# 英文版 7-7

    Head First C# is a complete learning experience for object-oriented programming, C#, and the Visual Studio IDE. Built for your brain, this book covers Visual C# 2008, Visual Studio 2008, and the .NET ...

    Head First C# 英文版 7-6

    Head First C# is a complete learning experience for object-oriented programming, C#, and the Visual Studio IDE. Built for your brain, this book covers Visual C# 2008, Visual Studio 2008, and the .NET ...

    Head First C# 英文版 7-4

    Head First C# is a complete learning experience for object-oriented programming, C#, and the Visual Studio IDE. Built for your brain, this book covers Visual C# 2008, Visual Studio 2008, and the .NET ...

    Head First Go 1st Edition

    It features great concurrency support and automatic memory management (garbage collection). Existing Go books tend to be highly technical in nature, teaching all aspects of the language regardless ...

    【Java 8 GC 调优】Garbage-First(G1)

    G1 是一个 服务器风格(Server-Style)的垃圾收集器。其适用目标是具有大内存的多处理器计算机。它试图在实现高吞吐量的同时,高概率地满足 GC暂停时间 目标。整个堆操作,如 全局标记,与业务线程同时运行。...

    Java Performance Companion(Addison,2016)

    Picking up where Charlie Hunt and Binu John’s classic Java Performance left off, this book provides unprecedented detail on two powerful Java platform innovations: the Garbage First (G1) garbage ...

    《剑指offer》JVM面试题总结.pdf

    JVM 面试题总结 JVM 的主要作用是什么? 请你描述一下 Java 的内存区域? 请你描述一下 Java 中的类加载...Garbage First 收集器 JVM 常用命令介绍 什么是双亲委派模型? 双亲委派模型的缺陷? 双亲委派机制的三次破坏

    Head First C# 英文版 7-3

    Head First C# is a complete learning experience for object-oriented programming, C#, and the Visual Studio IDE. Built for your brain, this book covers Visual C# 2008, Visual Studio 2008, and the .NET ...

    Head First C# 英文版 7-1

    Head First C# is a complete learning experience for object-oriented programming, C#, and the Visual Studio IDE. Built for your brain, this book covers Visual C# 2008, Visual Studio 2008, and the .NET ...

    Head First C# 英文版 7-5

    Head First C# is a complete learning experience for object-oriented programming, C#, and the Visual Studio IDE. Built for your brain, this book covers Visual C# 2008, Visual Studio 2008, and the .NET ...

    Head First C# 英文版 7-2

    Head First C# is a complete learning experience for object-oriented programming, C#, and the Visual Studio IDE. Built for your brain, this book covers Visual C# 2008, Visual Studio 2008, and the .NET ...

    Ruby Performance Optimization(Pragmatic,2015)

    First, you’ll learn the best practices for writing Ruby code that’s easy not only on the CPU, but also on memory, and that doesn’t trigger the dreaded garbage collector. You’ll find out that ...

    VM调优实战指南:GC与性能优化

    JVM有多种GC算法,包括串行GC、并行GC、CMS(Concurrent Mark Sweep)和G1(Garbage-First)等。 实例:查看GC日志 在JVM运行过程中,可以通过日志文件查看GC的运行情况。以下是一个简单的GC日志输出示例:

    Ruby.Performance.Optimization

    First, you'll learn the best practices for writing Ruby code that's easy not only on the CPU, but also on memory, and that doesn't trigger the dreaded garbage collector. You'll find out that garbage ...

Global site tag (gtag.js) - Google Analytics