Java 7(JDK 7)垃圾收集和文档上的G1

Java 7已经出现了一段时间了,但是在垃圾收集器 ,特别是新的G1收集器的configuration方面我找不到任何好的资源。

我的问题:

  1. G1是Java 7中的默认收集器,如果不是,我该如何激活G1?
  2. g1在Java7中有什么可选的设置?
  3. Java 7中的其他收集器(如cms并行收集器)是否有任何更改?
  4. 我在哪里可以find关于在Java 7垃圾收集良好的文档?

在我的Java 1.7.0_01版本中,G1垃圾回收器不是默认的。 通过使用一些额外的命令行选项,你可以看到自己:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version -XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC java version "1.7.0_01" Java(TM) SE Runtime Environment (build 1.7.0_01-b08) Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode) Heap PSYoungGen total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000) eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000) from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000) to space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000) PSOldGen total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000) object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000) PSPermGen total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000) object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000) 

不过,您不需要启用实验性选项即可开启G1收集器,

 > java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version -XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation java version "1.7.0_01" Java(TM) SE Runtime Environment (build 1.7.0_01-b08) Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode) Heap garbage-first heap total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000) region size 1024K, 1 young (1024K), 0 survivors (0K) compacting perm gen total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000) the space 20480K, 9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000) No shared spaces configured. 

我不知道你在哪里可以find好的文档。

甲骨文终于在Java 7 U4上取得了官方的官方声明: http : //www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html

说明: http : //docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

命令行选项: http : //www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

不过,我并不认为这是Java 7中的默认收集器。对于服务器,默认情况下是Java 6中的Parallel Collector。

是的,G1是Java 1.7 JVM中的新标准垃圾回收器。

在这里你可以find大量关于如何使用和configuration新垃圾回收器的信息:

使用G1 G1仍然被认为是实验性的,可以使用以下两个参数启用:

-XX:+ UnlockExperimentalVMOptions -XX:+ UseG1GC

要设置GC暂停时间目标,请使用以下参数:

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

对于G1,可以指定一个时间间隔,在此期间,GC暂停应该不超过上述时间:

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

请注意,上述两个选项代表的目标,而不是承诺或保证。 他们可能在某些情况下运作良好,但在其他情况下则可能运作良好,并不总是能够遵守。

或者,可以明确规定年轻一代的规模,以影响撤离暂停时间:

-XX:+ G1YngngGenSize = 512m(512兆字节的年轻一代)

G1也使用了相当于幸存空间,这当然是一组(可能是非连续的)区域。 它们的大小可以用通常的参数来指定(例如-XX:SurvivorRatio = 6)。

最后,为了充分发挥G1的潜力,请尝试设置这两个默认禁用的参数,因为它们可能会发现一个罕见的竞争条件:

-XX:+ G1ParallelRSetUpdatingEnabled -XX:+ G1ParallelRSetScanningEnabled

还有一点要注意的是,当设置-XX:+ PrintGCDetails时,G1与其他HotSpot GC相比非常详细。 这是因为它打印每个GC线程的时间和其他信息非常有助于分析和故障排除。 如果您想要更简洁的GC日志,请切换到使用-verbosegc(尽pipebuild议您获取更详细的GC日志)。

我也发现这篇文章对于理解G1的内容非常有帮助。

更多信息在这里 。

1. G1是Java 7中的默认收集器(…)

此Java 5页面上的规则在Java 7(和AFAIK,Java 8)中仍然适用:

在运行服务器虚拟机的服务器级机器上,垃圾收集器(GC)已经从前一个串行收集器(-XX:+ UseSerialGC)更改为并行收集器(-XX:+ UseParallelGC)。

但是也要考虑:

  • 64位JVM不带-client虚拟机,所以总是“服务器类”
  • 从Java 7开始,使用-XX:+ UseParallelGC(无论设置还是隐含)还包含-XX:+ UseParallelOldGC(即,除非明确禁用)

例如,如果在Windows x64上运行…

  • Java 7 64位,默认情况下,你可以得到并行GC(适用于年轻一代和老一代)。
  • Java 8 32位,默认情况下你得到串行GC(两代)

1.(…)如何激活G1?

从Java 7开始,只需-XX:+UseG1GC 。 也许也有趣的是, 当你想要:

如果应用程序具有以下一个或多个特性,那么现在使用CMS或ParallelOld垃圾收集器运行的应用程序将有益于切换到G1。

  • 超过50%的Java堆被实时数据占用。
  • 对象分配率或提升率显着不同。
  • 不希望的长时间的垃圾收集或压缩暂停(超过0.5到1秒)

2. g1在Java7中有哪些可选设置?

我自己并没有使用G1,但是我认识到它遵循用于调谐其他平行收集器的相同的基本“吞吐量/人体工程学”标志。 根据我对Parallel GC的经验, -XX:GCTimeRatio一直是提供预期的速度 – 内存权衡的关键。 因人而异。

这里列出了 G1特定的选项

3.在Java 7中有没有更改(…)cms或并行收集器?

不知道, 但…

G1计划作为并行标记扫描收集器(CMS)的长期替代品,

4.我在哪里可以find有关Java 7垃圾收集的良好文档?

可以find一个痛苦,不是吗? 可能是我find的最好的“枢纽”页面是这样的:

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html

需要深入阅读,但如果您需要进行一些调整,则值得您花时间。 特别有见识的是: 垃圾收集器人体工程学

  1. G1是Java 7中的默认收集器,如果不是,我该如何激活G1?

G1不是Java 7中的默认收集器。- -XX:+UseG1GC将启用G1GC

  1. g1在Java7中有什么可选的设置?

有许多。 看看这个oracle文章的完整信息。

G1 GC是一个自适应垃圾回收器,具有默认设置,使其无需修改即可高效工作。

由于这个原因,定制关键参数

 -XX:MaxGCPauseMillis -XX:G1HeapRegionSize -XX:ParallelGCThreads -XX:ConcGCThreads 

并将所有其他参数保留为默认值

以下是重要选项及其默认值的列表。 此列表适用于最新的Java HotSpot VM版本24.您可以在JVM命令行上调整和调整G1 GC设置。

重要默认值:

 -XX:G1HeapRegionSize=n 

设置G1区域的大小。 该值将是2的幂,可以从1MB到32MB。 目标是基于最小的Java堆大小,大约有2048个区域。

 -XX:MaxGCPauseMillis=200 

为所需的最大暂停时间设置一个目标值。 默认值是200毫秒。 指定的值不适应您的堆大小。

 -XX:G1NewSizePercent=5 

设置堆的百分比作为年轻一代规模的最小值。 默认值是Java堆的5%。

 -XX:G1MaxNewSizePercent=60 

设置用于年轻一代大小的最大堆大小的百分比。 默认值是Java堆的60%。

 -XX:ParallelGCThreads=n 

设置STW工作线程的值。 将n的值设置为逻辑处理器的数量。 n的值与逻辑处理器的数量相同,最大值为8。

如果有八个以上的逻辑处理器,则将n的值设置为大约5/8个逻辑处理器。 这在大多数情况下都可以工作,除了较大的SPARC系统,其中n的值可以是逻辑处理器的大约5/16。

 -XX:ConcGCThreads=n 

设置平行标记线程的数量。 将n设置为并行垃圾回收线程(ParallelGCThreads)数量的大约1/4。

 -XX:InitiatingHeapOccupancyPercent=45 

设置触发标记周期的Java堆占用阈值。 默认占用率是整个Java堆的45%。

 -XX:G1MixedGCLiveThresholdPercent=65 

将旧区域的占用阈值设置为包含在混合垃圾回收循环中。 默认占用率是65%

 -XX:G1HeapWastePercent=10 

设置你愿意浪费的堆的百分比。 当可回收百分比小于堆浪费百分比时,Java HotSpot VM不会启动混合垃圾回收循环

 -XX:G1MixedGCCountTarget=8 

设置标记周期后混合垃圾收集的目标数量,以收集G1MixedGCLIveThresholdPercent实时数据最多的旧区域。 默认值是8个混合垃圾收集

 -XX:G1OldCSetRegionThresholdPercent=10 

设置混合垃圾回收周期中要收集的旧区域数量的上限。 默认值是Java堆的10%

 -XX:G1ReservePercent=10 

设置保留内存的百分比以保持空闲状态,以降低发生空间溢出的风险。 默认值是10%。 当您增加或减less百分比时,请确保将Java堆的总数调整为相同的数量。

您已经重新configuration了许多G1GC参数,如果您按照以上文档页面进行操作,则不需要这些参数。 请特别在ParallelGCThreadsConcGCThreads上进行交叉检查,这些信息将基于您的CPU核心。 删除重新configuration的不必要的参数。

oracle的build议 :

当您评估和微调G1 GC时,请牢记以下build议:

  1. 年轻一代大小 :避免使用-Xmn选项或任何或其他相关选项(如-XX:NewRatio显式设置年轻一代的大小。 确定年轻一代的规模将超越目标的暂停时间目标

  2. 暂停时间目标:当您评估或调整任何垃圾回收时,始终存在延迟与吞吐量之间的权衡。 G1 GC是一个具有统一暂停的增量垃圾收集器,但是在应用程序线程上的开销也更大。 G1 GC的吞吐量目标是90%的应用程序时间和10%的垃圾收集时间

  1. Java 7中的其他收集器(如cms或并行收集器)是否有任何更改?

Java 7有一些变化。看看这篇文章

  1. 我在哪里可以find关于在Java 7垃圾收集良好的文档?

请参阅有关gc和相关SE问题的oracle文档页面:

生产中的Java G1垃圾收集

http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html (由Wojtek提供的链接)提供的文档似乎是唯一的官方链接,但信息似乎过时了,因为这里提到的一些标志只在testing版本中可用,在生产版本中不再存在。 有些来自Oracle的人应该提供一些关于G1 GC的更新文档。

没有G1在jdk 1.7.0_02中不是默认的垃圾收集器。 默认的垃圾收集器取决于机器的类别。 如果机器是Server类的,那​​么默认的垃圾收集器是Throughput Collector。 如果机器是Client类,那么默认的垃圾收集器是Serial Collector。

默认情况下你并不想使用G1收集器,因为它并不比其他的更好。 这只适用于特殊目的。

在低延迟的情况下,应用程序比CMS略胜一筹,因为它稍微短了一些,而且更可预测的暂停时间。 作为交换,吞吐量比CMS要差得多。

所以只有延迟很重要,但吞吐量并不重要。 如果两者都很重要,那么留在CMS中。