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

原创
开发 后端
G1是一个服务端垃圾回收器,在前日发布的Java SE 6 u14中包含了一个体验版本,并计划在JDK 7中正式露面。本文中你将看到Java 7 G1的一些特性和描述,使用方法以及开发的最新进展。

【51CTO精选译文】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仍然被看做是试验品,可以使用下面两个参数开启它:

  1. -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC 

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

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

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

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

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

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

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

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

  1. -XX:SurvivorRatio=6 

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

  1. -XX:+G1ParallelRSetUpdatingEnabled  
  2.  
  3. -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差。

原文:Java HotSpot Garbage Collection

【编辑推荐】

  1. Java SE 6中的垃圾回收器G1收费是虚惊一场
  2. 垃圾回收器G1收费登场 是否预示Java将面临分叉威胁
  3. JDK 7中将支持正则表达式命名捕获组
  4. 6月5日外电头条:探秘Java 7模块化 类路径永远消失
  5. 4月17日外电头条:Java 7将向细颗粒并行化发展
责任编辑:yangsai 来源: 51CTO.com
相关推荐

2009-08-14 08:56:49

Java垃圾回收器G1

2024-10-22 16:26:11

2009-06-02 10:18:43

Java垃圾回收器垃圾回收器Java垃圾回收

2022-02-25 08:01:34

CMS

2023-11-16 08:00:56

Java11G1

2011-06-28 12:39:34

Java垃圾回收

2009-06-18 13:59:33

Java SE 6垃圾回收器

2020-06-01 20:08:47

垃圾G1回收器

2021-08-10 07:00:02

Java8 G1垃圾回收器

2021-08-15 18:59:13

垃圾收集器JDK

2010-09-26 14:08:41

Java垃圾回收

2015-06-17 14:10:52

OracleJava 9垃圾收集器

2022-08-29 08:01:43

G1CMS回收器

2015-07-29 10:28:59

JVM参数配置参数

2020-05-14 13:39:19

Java 垃圾回收机制

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-01-20 10:34:49

JVM垃圾回收算法

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2021-01-04 10:08:07

垃圾回收Java虚拟机

2011-07-29 09:31:32

JDK 7
点赞
收藏

51CTO技术栈公众号