Java 7新增垃圾回收器G1特性探秘

GD Star Rating
loading...

    G1垃圾回收器(简称G1 GC)是JDK 7中Java HotSpot VM新引入的垃圾回收器,Java SE 6 Update 14中已经包含了一个G1的体验版本(据51CTO之前的报导,在Java SE 6 u14于6月初登场时,原本Sun的声明是:G1垃圾回收器需要收费方能使用。然而之后不久,Sun表示这是一个误会,修改了原本的发布声明,并表示现在以及将来对G1的使用都是完全免费的),G1是设计用于替代HotSpot低延迟的并行标记/清除垃圾回收器(也叫做CMS)的。

    Java 7 G1属性

    G1是一个服务端垃圾回收器,有以下属性:

    ◆并行和并发性:G1利用了当今硬件中存在的并行性,当Java应用程序的线程被停止时,它使用所有可用的CPU(核心,硬件线程等)加速其停止,在停止过程中运行Java线程最小化整个堆栈。

    ◆代:和其他HotSpot GC一样,G1是一代,意味着它在处理新分配的对象(年轻代)和已经生存了一段时间的对象(年老代)时会不同,它主要集中于新对象上的垃圾回收活动,因为它们是最可能回收的,旧对象只是偶尔访问一下,对于大多数Java应用程序,代的垃圾回收对于替代方案具有重要优势。

    ◆压缩:和CMS不同,G1会随时间推移对堆栈进行压缩,压缩消除了潜在的碎片问题,确保长时间运行的操作流畅和一致。

    ◆可预测性:G1比CMS预测性更佳,这都是由于消除了碎片问题带来的好处,再也没有CMS中停止期间出现的负面影响,另外,G1有一个暂停预测模型,允许它满足(或很少超过)暂停时间目标。

    Java 7 G1描述

    和其它HotSpot GC相比,G1采用了一个非常不同的堆栈布局方法,在G1中,年轻代和年老代之间没有物理隔离,相反,它们之间有一个连续的堆栈,被分成大小一样的区域(region),年轻代可能是一套非连续的区域,年老代也一样,这就允许G1在年轻代和年老代之间灵活地移动资源。

    G1中的回收是通过消除暂停发生的,在此期间,幸存者指的是回收集被转移到另一个区域,以便回收区域可以再生,消除暂停是并行的,所有可用的CPU都会参加,大多数消除暂停收集可用的年轻区域,和其它HotSpot GC中的年轻回收是一样的,在暂停期间偶尔也会选择年老区域回收,因为G1在年轻一代回收上还肩负了年老代的回收活动。

    和CMS相同的是,G1会定期执行一个并发标记暂停,这个阶段的主要职责是识别哪一个年老区域的垃圾对象是最完整的,因为这些是最有效和最值得回收的,和CMS不同的是,G1不会执行并发清除暂停,相反,最有用的年老区域是通过并发标记暂停标识的,在随后的消除暂停期间进行回收。

    使用G1

    G1仍然被看做是试验品,可以使用下面两个参数开启它:

    -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

    为了设置一个GC暂停时间目标,使用下面的参数:

    -XX:MaxGCPauseMillis =50  (暂停时间目标50ms)

    使用G1时还可以指定时间间隔,当GC暂停持续时间没有上面给出的时间长时可以这么用:

    -XX:GCPauseIntervalMillis =200  (暂停间隔目标200ms)

    注意上面两个选项表示的目标,没有承诺和保证,在某些情况下它们可能能够工作,GC不是总是能够执行它们。

    另外,年轻代的大小可以明确指定影响消除暂停时间:

    -XX:+G1YoungGenSize=512m (年轻代大小512M)

    G1也使用幸存空间(可能是非连续的区域),它们的大小可以使用一个常见的参数指定,如:

    -XX:SurvivorRatio=6

    最后,为了运行G1充分发挥其潜力,尝试设置以下两个默认被禁用了的参数,因为它们可能会暴露一个罕见的竞争状态:

    -XX:+G1ParallelRSetUpdatingEnabled

    -XX:+G1ParallelRSetScanningEnabled

    注意当设置了-XX:+PrintGCDetails后,G1比起其它HotSpot GC要啰嗦得多,因为它会打印每个GC线程的计时和其它有助于进行故障排除的信息,如果你想使GC日志更简单,请使用-verbosegc参数。

    Java 7 G1最新进展

    G1开发现在主要集中在遗留的可靠性问题和改善性能,同时也在逐步移除下面的限制:

    ◆G1不能完全支持JVM工具接口(JVM TI)或Java管理扩展(JMX),因此关于G1的监视和管理工具很可能不能正常工作;

    ◆G1不支持增量永久性代回收,如果一个应用程序产生了许多类转储,需要永久性代回收,这在完整GC期间是可以实现的;

    ◆从GC暂停时间来说,G1有时表现比CMS好有时比CMS差。

已有3条评论 发表评论

  1. 冰剑 /

    JAVA的版本让我有点经稀里糊涂的,从1.0 1.2 1.4 1.5然后就直接飞到了5.0。。

    现在都还是稀里糊涂的。。

    GD Star Rating
    loading...
    1. 自由人 / 本文作者

      呵呵,我现在也不清楚了

      GD Star Rating
      loading...
  2. keelii /

    嗯。我是不了解Java,虽然学过。

    GD Star Rating
    loading...

发表评论