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

Garbage First(G1)介绍

    博客分类:
  • jvm
阅读更多

介绍:

Garbage First(G1)致力于在多CPU和大内存服务器上对垃圾收集提供软实时目标(soft real-time goal )和高吞吐量(high throughput )。从JDK 6u14开始就已经在Hotspot上试验,到现在的DK7依然没有走出实验室:

#java -version
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b05)
Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)

#java -server -XX:+PrintFlagsFinal | grep UseG1GC
bool UseG1GC                                   = false           {product}

 

关于region:

在G1中,heap被平均分成若干个大小相等的区域(region)。每个region都有一个关联的remembered set (RS),RS的数据结构是hash table,里面的数据是card table (heap中每512byte映射在card table 1byte)。简单的说RS里面存在的是region中live objects的指针。当region中数据发生变化时,首先反映到card table中的一个或多个card上,RS通过扫描内部的card table得知region中内存使用情况和存活对象。

关于内存分配:

由于G1主要关注于多CPU多线程,所以内存分配采用 thread-local allocation buffers (TLABs)技术。每个分配线程都有一个自己的buffers用来分配对象,当buffers用完或者不够的时候,去重新申请一块内存放在自己的thread-local里面。这样对象的内存分配被最小化到私有的buffers里面,缓解了并发分配内存的压力。

当region被填满后,分配内存的线程会重新选择一个新的region。空region被组织到一个linked list里面,这样可以快速找到新的region。

对于大对象的分配不是在TLABs进行的,而是在TLABs之外。当一个对象的大小超过region的3/4的时候,这个对象被认为是巨大的(humongous )。巨大的对象被分配到特殊的区域(heap regions )。这些区域只包含巨大对象(humongous object )。

执行过程:

  • 初始标记 :Initial Marking
  • 并发标记 :Concurrent Marking
  • 最终标记 :Final Marking
  • 计数并清理 :Live Data Counting and Cleanup

G1执行的第一阶段是初始标记(Initial Marking ),这个阶段是STW(Stop the World )的,所有mutator threads将被停止,标记出从GC Root开始直接可达的对象。然后,所有mutator threads将被重启,进入并发标记(Concurrent Marking )阶段。这个阶段从GC Root开始对heap中的对象标记,标记线程与应用程序线程并行直接,耗时较长。当并发标记完成后,开始最终标记(Final Marking )阶段。这个阶段主要是标记那些在并发标记阶段发生变化的对象。同样最终标记也要STW,但是多个标记线程并行运行,很快就可以完成。最后一个阶段会对每个区域(region)的回收成本和价值进行排序,根据用户指定的停顿时间,选择性的收集某些区域的对象,并统计每个区域对象的数量。

与CMS对比:

总体来说,G1跟CMS一样,是一块低延时的收集器,同样牺牲了吞吐量,不过二者之间得到了很好的权衡。

G1与CMS对比有一下不同:

1.分代: CMS中,堆被分为PermGen,YoungGen,OldGen;而YoungGen又分了两个survivo区域。在G1中,堆被平均分成几个区域(region),在每个区域中,虽然也保留了新老代的概念,但是收集器是以整个区域为单位收集的。

2.算法: 相对于CMS的“标记——清理”算法,G1会使用压缩算法,保证不产生多余的碎片。收集阶段,G1会将某个区域存活的对象拷贝的其他区域,然后将整个区域整个回收。

3.停顿时间可控: 为了缩短停顿时间,G1建立可预存停顿模型,这样在用户设置的停顿时间范围内,G1会选择适当的区域进行收集,确保停顿时间不超过用户指定时间。

 

 

参考资料:见附件

 

分享到:
评论

相关推荐

    Garbage-First_garbage_collection g1垃圾免积分下载

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

    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-...

    G1(Garbage -First).xmind

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

    GarbageFirst

    GarbageFirst Garbage Collection (java G1垃圾回收)

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

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

    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 ...

    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 ...

    tomcat垃圾回收配置模版.docx

    tomcat垃圾回收配置模版 G1回收器(Garbage-First) G1回收器拥有独特的垃圾回收策略,回收期间可多线程同时工作. 拥有与应用程序交替执行的能力,部分工作可与应用程序同时执行,在整个GC期间不会完全阻塞应用程序。

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

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

    JAVA虚拟机精讲

    Mark-Sweep)收集器和G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM 基于栈的架构模型和执行引擎(解释器的工作流程、JIT 编译器的工作流程、分层编译策略、热点探测功能)等技术。

    Java虚拟机精讲.高翔龙.带书签完整版.pdf

    Mark-Sweep)收集器和G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM 基于栈的架构模型和执行引擎(解释器的工作流程、JIT 编译器的工作流程、分层编译策略、热点探测功能)等技术。

    JAVA虚拟机精讲 pdf

    Mark-Sweep)收集器和G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM 基于栈的架构模型和执行引擎(解释器的工作流程、JIT 编译器的工作流程、分层编译策略、热点探测功能)等技术。

    降低Java垃圾回收开销的5条建议

     随着一再拖延而即将发布的 Java9,G1(“Garbage First”)垃圾回收器将被成为 HotSpot 虚拟机默认的垃圾回收器。从 serial 垃圾回收器到CMS 收集器, JVM 见证了许多 GC 实现,而 G1 将成为其下一代垃圾回收器。 ...

    java虚拟机精讲(电子工业出版社出版)

    Mark-Sweep)收集器和 G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM 基于栈的架构模型和执行引擎(解释器的工作流程、JIT 编译器的工作流程、分层编译策略、热点探测功能)等技术。 第1 章 Java体系...

    Java9中的GC调优基础

    Java9引入了很多新的特性,除了闪瞎眼的ModuleSystem和REPL,最重要的变化我认为是默认GC(GarbageCollector)修改为新一代更复杂、更全面、性能更好的G1(Garbage-First)。JDK的维护者在GC选择上一直是比较保守的...

Global site tag (gtag.js) - Google Analytics