快捷搜索:

Java新型垃圾回收器G1深入探索

G1垃圾收受接收器

“G1垃圾收受接收”的英文全称是 Garbage-First Garbage Collector (又被称作G1 GC),这是一个新型的垃圾收受接收器,由JDK 7中的Java HotSpot VM 引入。这个技巧曾经在Java SE 6 Update 14版本中呈现过一个试验性的,然后 G1 被 HotSpot的 反映快速(low-latency)的 Concurrent Mark-Sweep GC (简称 CMS)经久取代。

属性

G1 是一个“办事器风格(server-style)”的垃圾收受接收器,它主要有下面的这些属性:

◆并行和并发。 G1 可以从本日最新的硬件中得到并行的能力。它能够应用所有可用的CPU(CPU多核,硬件多线程,等)来加速它的 “stop-the-world” 机制(这个机制简称STW,即,在履行垃圾网络算法时,Java利用法度榜样的其他所有除了垃圾网络赞助器线程之外的线程都被挂起)。

◆分代处置惩罚。 就像其它的HotSpot 垃圾收受接收器,G1 是分代的,也便是说,它在处置惩罚新分配的工具(年轻代)和已经生计了一段光阴的工具(大哥代)时会不合,它会更多地斟酌一些新创建的工具实例,由于越新创建的就越有最大年夜的可能性被收受接收,老工具只是有时造访一下。对付大年夜多半的Java利用来说,这个机制可以极大年夜地前进收受吸见效率。

◆紧凑内存(碎片收拾)。 不像CMS,G1 会对堆进行内存收拾。压缩可以打消潜在的内存碎片的问题,这样法度榜样就可以更长光阴的平滑运行。

◆预见性的。 G1 比起 CMS 来有更多的预见性。这个主要照样用来打消内存碎片的问题。内存的碎片少了,Stop-the-World的停息光阴也会被削减。

描述

比起其它的HotSpot 垃圾收受接收器来说,G1 应用了一种异常不合平常的措施来治理堆内存的结构。在G1中,在工具新生代和老一代上没有在物理上把他们分隔开来。取而代之的是,它把一个继续的堆内存拆分成了几个相同大年夜小的区域。新孕育发生的工具和老的工具都邑被放在一系列可能不会继续的区域中。之以是这样做,便是为了让G1可以更机动地移动老工具所占用的资本给新的工具。

G1中的内存收聚会会议发生 “疏散停息”,当内存从一系例区域开始收受接收时,这些区域所引用的 collection set 会被疏散到另一些区域中,这样,我们会有一整块的内存来从新被申请。疏散会发生全部法度榜样的停息,但“疏散”这些内存可以被并交运行,当然,你要有多核或多线程技巧来支持。绝大年夜多半的“疏散停息”会去网络那些可用的对照新的内存区域,是以,这和其它的 HotSpot 垃圾收受接收器是相同的。偶而才会去查看一下老区域中的内存是否可以收受接收。

在 CMS中,其周期性的履行一个 concurrent marking phase. 这个phase中最主要的工作是,识别哪些老的区域中充溢了可以收受接收的工具,由于这是最有效率和最相宜的收受接收。但在G1中,G1不会履行那个所谓的 concurrent sweeping phase, 取而代之的是,去识别那些的最相宜的老的区域是在并发的“疏散停息”中进行的(后面会做先容)。

应用 G1

G1 今朝仍旧还在试验阶段,应用下面两个参数可以打开G1机制:

-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

下面是设置垃圾收受接收器的停息光阴:

-XX:MaxGCPauseMillis =50 (设置停息光阴为 50ms)

在G1中,你还可以给垃圾收受接收器的停息设置一个光阴距离:

-XX:GCPauseIntervalMillis =200 (设置停息光阴距离 200ms)

留意,上面的两个参数只是代表目标,收受接收器并不包管。他们可能在某些环境下事情地很好,也可能在其它环境下不可,以是,垃圾收受接收器并不老是屈服这两个参数设置。

别的,新生代的内存大年夜小可以被设置,这个参数同样会影响“疏散停息”的光阴:

-XX:+G1YoungGenSize=512m (设置新生代内存为 512兆字节)

G1 同样可以应用survivor 空间,是的,这便是若干个区域。大年夜小可以由通用的参数所指定(如: -XX:SurvivorRatio=6)。

着末,假如你要发挥G1的所有潜能,你可以考试测验设置下面两个参数,它们默认上是关闭的,由于在一些很罕见的环境下,这两个参数会发生race condition(竞争前提):

-XX:+G1ParallelRSetUpdatingEnabled -XX:+G1ParallelRSetScanningEnabled

还有一件事是G1能够申报比其它垃圾收受接收站更具体的信息,当然,你必要设置下面这个参数:

-XX:+PrintGCDetails

这个参数会输出很多有用的信息供你查看机能与以 trouble-shooting.假如你想要简单的日志,你可以把这个开关设置到 -verbosegc .

状态

◆G1 开拓今朝主要关注于办理一些残留的稳定性的问题,以及前进机能,并且去除下面的限定:

◆G1 并不完全支持 JVM Tool Interface (JVM TI) 或 Java Management Extensions (JMX),以是,这些监控和治理对象无法精确地感化于G1.

◆G1 不支持增量的长生代collection.假如一个利用在卸载很多的类,因些必要很多的长生代Collection,今朝的G1还不支持,不过终极版会支持。

关于垃圾收受接收器的停息光阴,G1的体现比起CMS来说是时好时坏。以是,还有很多事情必要让G1的体现加倍稳定,毫不能比CMS还差,不然G1还有什么意思呢?

您可能还会对下面的文章感兴趣: