G1垃圾收集器介绍

原文链接,译者:Greenster

简介

Oracle在JDK7 update 4之后开始完全支持G1垃圾收集器,G1是一个针对多处理器大容量内存的服务器端的垃圾收集器,其目标是在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求。G1在执行一些Java堆空间中的全区域操作(如:全局标记)时是和应用程序线程并发进行的,因此减少了Java堆空间的中断比例。(译者注:可简单理解为减少了Stop-the-World的时间比例)

技术说明

G1收集器通过下面一些方法实现了高性能和减少暂停时间的目的。

首先将Java堆空间划分为一些大小相等的区域(region),每个区域都是虚拟机中的一段连续内存空间。G1通过执行并发的全局标记来确定整个Java堆空间中存活的对象。标记阶段完成后,G1就知道哪些区域基本上是空闲的。在回收内存时优先回收这些区域,这样通常都会回收相当数量的内存。这就是为什么它叫做Garbage-First的原因。顾名思义G1关注某些区域的回收和整理,这些区域中的对象很有可能被完全回收。而且G1使用了一个暂停时间预测模型使得暂停时间控制在用户指定的暂停时间内,并根据用户指定的暂停时间来选择合适的区域回收内存。

G1确定了可回收的区域后就是筛选回收(evacuation)阶段了。在此阶段将对象从一个或多个区域复制到单一区域,同时整理和释放内存。该阶段是在多个处理器上多个线程并行进行的,因此减少了暂停时间并提高了吞吐量。G1在每一次的垃圾收集过程中都不断地减少碎片,并能够将暂停时间控制在一定范围内。这些已经是以前的垃圾收集器无法完成的了。比如:CMS收集器并不做内存整理。ParallelOld收集器只是对整个Java堆空间做整理,这样导致相当长的暂停时间。

关于G1很重要的一点是它并不是一个实时收集器。尽管在绝大多数情况下都能够满足暂停时间的要求,但并非没有例外。因为G1是基于之前数次垃圾收集的经验值来估计在用户指定的暂停时间内有多少区域可以收集。因此它对于在区域上执行收集的成本有一个合理的较为精确的模型,并使用该模型来确定对哪些区域执行收集。

对于更详细的关于使用和配置G1的信息请参考JAVA虚拟机参数

推荐使用的场景

G1的首要目的是为那些需要大容量内存和较小GC延迟的应用程序提供解决方案。这通常是指那些堆大小设置在6GB以上,确定的、可以预测的暂停时间在0.5秒以内的应用程序。

如果应用程序符合以下一项或者多项特征,那么从CMS或者ParallelOld收集器切换到G1可能更合适。

  • 活动对象占据了超过50%的Java堆空间。
  • 对象分配率或者提升率波动明显。
  • 不希望有长时间的垃圾收集暂停时间(超过0.5秒或1秒)。

G1的前景

G1的使命是替换掉CMS收集器。通过对比G1和CMS收集器,可以发现G1是更好的一种解决方案。首先G1是一个压缩收集器,G1通过充分的压缩完全避免了使用细粒度的空闲列表(free lists)来分配内存,而是使用相对粗粒度的区域(regions)来分配内存。这明显简化了收集器,也很大程度上减少了内存碎片化的问题。此外,相比较CMS,G1可以预测出垃圾收集的暂停时间,并允许用户指定期望的暂停时间。

如果你有兴趣改善G1,请通过OpenJDK和邮件列表hotspot-gc-use@openjdk.java.net给我们反馈。 

时间: 2024-09-11 03:46:44

G1垃圾收集器介绍的相关文章

深入理解G1垃圾收集器

G1 GC是Jdk7的新特性之一.Jdk7+版本都可以自主配置G1作为JVM GC选项:作为JVM GC算法的一次重大升级.DK7u后G1已相对稳定.且未来计划替代CMS.所以有必要深入了解下: 不同于其他的分代回收算法.G1将堆空间划分成了互相独立的区块.每块区域既有可能属于O区.也有可能是Y区,且每类区域空间可以是不连续的(对比CMS的O区和Y区都必须是连续的).这种将O区划分成多块的理念源于:当并发后台线程寻找可回收的对象时.有些区块包含可回收的对象要比其他区块多很多.虽然在清理这些区块时

JVM垃圾收集器介绍

一.垃圾回收用到的主要算法 1.引用计数法 算法思路: 给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就加1:当引用失效时,计数器值就减1:当计数器的值为0时就可以把该对象删除. 算法优点: 实现简单,判定效率高 算法缺点: 难以解决对象之间相互循环引用的问题. 2.标记清除法 算法思路: 算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 算法优点:     算法缺点: 效率低,标记和清除两个过程

垃圾收集器Serial 、Parallel、CMS、G1

这里介绍4个垃圾收集器,如果进行了错误的选择将会大大的影响程序的性能.     时至今日,仍然有两个事情困扰着开发人员:垃圾收集(GC)和了解异性(程序猿的悲鸣),后者我确实不太了解,因为我被前者搞的无暇顾及怎么了解异性,特别是当知道在JAVA8中对这一区域有了很大的改进和提升还有移除了PermGen和以一些新的令人兴奋的调优.     当我们谈到垃圾回收时,我们绝大多数都知道利用它的概念在我们日常的编程中.但是,当问题出现时,会发现很多是我们不知道的.JVM 最大误区之一就是它只有一个垃圾回收

Garbage First(G1)垃圾收集器

引言:G1垃圾收集器采用一个略微不同的手段来解决并行.串行以及CMS GC的众多缺陷.对于大的Java堆来说,通过将Java堆拆分成一个个分区,G1会比其他垃圾收集器有更好的综合表现.本文选自<Java性能调优指南>. G1垃圾收集器采用一个略微不同的手段来解决并行.串行以及CMS GC的众多缺陷.G1将堆拆成一系列的分区,这样在一个时间段内,大部分的垃圾收集操作就只是在一个分区内执行,而不是整个堆或整个(老年)代. 在G1里,年轻代就是一系列的内存分区,这意味着不用再要求年轻代是一个连续的内

我们的垃圾收集器

(译者注:这篇博文发表在2008年,虽然年代有些久远,但是文中说到的垃圾收集器我们至今还在使用,作者也谈到了对于G1垃圾收集器的期望.) 最近我在白板上给客户化了一个图表,他们似乎对这个有点兴趣,所以我想我可以重画一遍来给你们消遣. 每个蓝色的盒子都代表了一个收集器,用来收集某一代.黄色区域中的蓝色盒子是用来收集新生代的,灰色区域中的蓝色盒子是用来收集老年代的. Serial"是一个单线程.stop-the-world.使用复制算法的收集器. "ParNew" 是一个多线程.

深入理解JVM之四:详解垃圾收集器

前言 前面已经对垃圾收集算法有了较为详细的介绍,这里我们将对JVM中具体的垃圾回收器进行介绍,在虚拟机规范中并没有对垃圾回收器如何实现具体介绍,因此每个厂商的垃圾回收器可能会完全不同,但是我们介绍的是基于JDK1.7之后的Hotspot虚拟机(包括前面对Java虚拟机的介绍也是基于jdk1.7版本的).在Hotspot中,虚拟机的收集器主要有下: 可以看到垃圾收集器是按对象的分代来划分的,可以用线条连接的垃圾回收器表示两者可以配合使用.可以看到新生代垃圾收集器有Serial.ParNew.Par

G1 收集器

G1是一款面向服务端应用的垃圾收集器.初次发布是在JDK 7这一版本中.长久的目标是替代CMS收集器. 1.介绍 1.1 G1收集器通过下面一些方法实现了高性能和减少暂停时间的目的 首先将Java堆空间划分为一些大小相等的区域(region),每个区域都是虚拟机中的一段连续内存空间.G1通过执行并发的全局标记来确定整个Java堆空间中存活的对象.标记阶段完成后,G1就知道哪些区域基本上是空闲的.在回收内存时优先回收这些区域,这样通常都会回收相当数量的内存.这就是为什么它叫做Garbage-Fir

java中HotSpot算法及垃圾收集器简介

垃圾回收算法基本思想: 1.枚举根节点(GC Roots) 在垃圾回收时,我们要想办法找出哪些对象是存活的,一般会选取一些被称为GC Root的对象,从这些对象开始枚举.枚举时要求所有对象停下来,也就是大家所称的"Stop the world".所有的算法实现都会将虚拟机停下来的,否则分析结果的准确性将无法保证.当执行系统停顿下来之后,虚拟机不需要遍历所有的根节点和上下文去确定GC Roots,而是存在着一个OopMap的数据结构来达到这个目的.在类加载完成的时候,虚拟机就会把什么类的

jdk1.7 HotSpot虚拟机 怎么查看使用的哪种垃圾收集器

问题描述 jdk1.7 HotSpot虚拟机 怎么查看使用的哪种垃圾收集器 怎么查看虚拟机使用的哪种垃圾收集器?是G1,还是CMS? 启动java的参数中没有配置-XX:+UseG1GC这种参数 $ ./java -version java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08,