JDK 1.7.0_04 及更高版本(包括 Java 8 和 Java 9)提供的 Oracle JVM 垃圾收集器

11 篇文章 0 订阅

随着 G1 终于在 1.7.0_04(Java 7 更新 4)版本中得到正式支持——即不再是实验性垃圾收集器,值得评估一下我们现在在 Sun JVM 中可用的垃圾收集器。以下所有详细信息都特别与 1.7.0_04 之后的 Sun JVM 相关。

现在有七种主要的垃圾收集算法,其中一种(PS Scavenge)有两种截然不同的模式,我将它们称为两种不同的算法(即,有和没有自适应(adaptive) GC),另一种(并发收集器 the concurrent collector)有大量的选项,这使得它实际上至少有六个算法合二为一!列出垃圾收集器很有用,这就是我在这里要做的。

首先,我将描述实际不同的主要垃圾收集器。有七个(我将 G1 收集器算作一个):

年轻代收集器(Young generation collectors)

Copy (enabled with -XX:+UseSerialGC)

串行复制收集器(the serial copy collector),使用一个线程将幸存的对象从 Eden 复制到 Survivor 空间以及在 Survivor 空间之间复制,直到它确定它们已经存在足够长的时间,然后将它们复制到老年代。

PS Scavenge (enabled with -XX:+UseParallelGC)

并行清除收集器(the parallel scavenge collector),像复制收集器(the Copy collector)一样,但使用多个线程并行(parallel),并且对如何收集老年代有一些了解(主要是为了与串行(serial )和 PS 老年代收集器一起使用而编写的)。

ParNew (enabled with -XX:+UseParNewGC)

并行复制收集器(the parallel copy collector),就像复制收集器(the Copy collector)一样,但使用多个线程并行(parallel),并有一个内部“回调(callback)”,允许老年代收集器对其收集的对象进行操作(真正为与并发收集器一起使用而编写的)。

G1 Young Generation (enabled with -XX:+UseG1GC)

垃圾优先收集器(the garbage first collector),使用“垃圾优先(Garbage First)”算法,将堆分成许多更小的空间,但在 G1 的年轻代中,这些空间仍分为 Eden 和 Survivor 空间。

老年代收集器(Old generation collectors)

MarkSweepCompact (enabled with -XX:+UseSerialGC)

串行标记清除收集器(the serial mark-sweep collector),使用串行(单线程)全标记清除垃圾收集算法(a serial (one thread) full mark-sweep garbage collection algorithm),可选压缩(with optional compaction)。

PS MarkSweep (enabled with -XX:+UseParallelOldGC)

并行清除标记扫描收集器(the parallel scavenge mark-sweep collector),MarkSweepCompact 的并行版本(即使用多线程)。

ConcurrentMarkSweep (enabled with -XX:+UseConcMarkSweepGC)

并发收集器(the concurrent collector),尝试在后台完成大部分垃圾收集工作,而不会在其工作时停止应用程序线程(仍有一些阶段(phase)必须停止应用程序线程,但这些阶段试图保持最低暂停时间)的一种垃圾收集算法。请注意,如果并发收集器收集的速度无法跟上垃圾产生的速度,那仅在下一次 GC时,转为使用串行的MarkSweepCompact收集器收集(并发模式失效 concurrent mode failure)。

G1 Mixed Generation (enabled with -XX:+UseG1GC)

垃圾优先收集器(the garbage first collector),使用“垃圾优先(Garbage First)”算法将堆分成许多更小的空间。


除ConcurrentMarkSweep之外的所有垃圾收集算法都 stop-the-world,即它们在运行时停止所有应用程序线程 - 这个停止称为“暂停(pause)”时间。ConcurrentMarkSweep尝试在后台完成大部分工作和减少停顿的时间,但它也有stop-the-world的阶段(phase)以及并发模式失效下切换到完全(fully) stop-the-world 的 MarkSweepCompact。(G1收集器有一个并发阶段,但目前主要是stop-the-world)。

垃圾收集器的组合(Combinations of Garbage Collectors)

这是一组可以使用的垃圾收集器组合,它们在两个不同的堆空间中运行,而这正是我们针对特定 JVM 设置实际得到的组合,因此我还将列出全部可能的组合。它不会爆炸成十几种组合,因为并非所有这些收集器都相互配合。G1实际上是一个不喜欢与其他人合作的反社会收集器;串行收集器(the serial collectors)是“最后被选择(last man picked)”的那个收集器;“PS”收集器喜欢互相合作;ParNew 和 Concurrent 喜欢一起工作。

从Java9开始,好理解了一些(再加上能够关闭自适应大小调整策略(adaptive sizing policy)),但在此之前它并不那么简单,所以这里列出了我认为是垃圾收集算法选项方面的主要选项。顺便说一句,对于那些喜欢琐事的人来说,随着时间的推移,我们实际上已经失去了一种垃圾收集算法,“train”(增量)垃圾收集器,它在各种 JVM 中可用,如 -Xincgc 和 -XX:+UseTrainGC 这些标志不再有用,前一个标志只是默默地转换为使用 ParNew 和 Concurrent,而后一个标志会在 JVM 中导致启动错误,并且从 Java 9 开始我们也失去了并发收集器(concurrent collector)中的增量算法(incremental algorithm)。

以下是全部可以组合可以工作垃圾回收算法组合列表:

Command Options*Resulting Collector Combination
-XX:+UseSerialGCyoung Copy old MarkSweepCompact
-XX:+UseG1GCyoung G1 Young old G1 Mixed
-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicyyoung PS Scavenge old PS MarkSweep 具有自适应大小(with adaptive sizing)
-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:-UseAdaptiveSizePolicyyoung PS Scavenge old PS MarkSweep 没有自适应大小(no adaptive sizing)
-XX:+UseParNewGC(在 Java 8 中已弃用,在 Java 9 中已删除,对于 ParNew,请参阅下面未弃用的行)young ParNew old MarkSweepCompact
-XX:+UseConcMarkSweepGC -XX:+UseParNewGCyoung ParNew old ConcurrentMarkSweep**
-XX:+UseConcMarkSweepGC -XX:-UseParNewGC(在 Java 8 中弃用,在 Java 9 中删除)young Copy old ConcurrentMarkSweep**

* 如果你在此处列出的所有组合中添加另一个未列出的GC算法,将无法让JVM启动,但 -XX:+UseParNewGC 除外,它只能与 -XX:+UseConcMarkSweepGC 组合

** 有许多选项可与 -XX:+UseConcMarkSweepGC 一起使用,它们会改变算法,例如

  • -XX:+/-CMSIncrementalMode(在 Java 8 中弃用,在 Java 9 中删除)- 使用或禁用增量并发 GC 算法
  • -XX:+/-CMSConcurrentMTEnabled - 使用或禁用并行(多线程)并发 GC 算法
  • -XX:+/-UseCMSCompactAtFullCollection - 发生Full GC 时使用或禁用压缩(compaction)

与上述之一等效的其他选项:

单独使用的命令选项相当于上表中的条目
-XX:+UseParallelGC-XX:+UseParallelGC -XX:+UseParallelOldGC
-XX:+UseParallelOldGC-XX:+UseParallelGC -XX:+UseParallelOldGC
-Xincgc(在 Java 8 中弃用,在 Java 9 中删除)-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
-XX:+UseConcMarkSweepGC-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
在大多数Windows上不设置Java 9 之后 -XX:+UseG1GC,之前 -XX:+UseSerialGC(另见本页
在大多数Unix上不设置Java 9 之后 -XX:+UseG1GC ,之前 -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy(另见本页
-XX:+AggressiveHeap-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy 以及一系列与调整内存和线程大小以及它们如何与操作系统交互相关的其他选项
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值