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

时间:2011-11-13 11:50:30

标签: java garbage-collection java-7 heap-memory g1gc

Java 7 已经出现一段时间了,但是我找不到任何关于垃圾收集器配置的好资源,特别是新的 G1收集器

我的问题:

  1. G1是Java 7中的默认收集器,如果不是,我该如何激活G1?
  2. g7在Java7中有哪些可选设置?
  3. Java 7中的 cms 并行收集器等其他收集器是否有任何更改?
  4. 在哪里可以找到有关Java 7中垃圾收集的优秀文档?

8 个答案:

答案 0 :(得分:47)

G1垃圾收集器不是我安装的Java 1.7.0_01版本的默认设置。您可以通过使用一些额外的命令行选项来自己查看:

> 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.

我不知道在哪里可以找到任何好的文档。

答案 1 :(得分:31)

Oracle终于在Java 7 U4中取得了G1官方成绩: 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中的并行收集器。

答案 2 :(得分:22)

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

Here您可以找到有关如何使用和配置新垃圾收集器的大量信息:

  

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

     

-XX:+ UnlockExperimentalVMOptions -XX:+ UseG1GC

     

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

     

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

     

对于G1,可以指定GC暂停期间的时间间隔   应该持续不超过上面给出的时间:

     

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

     

请注意,以上两个选项代表目标,而不是承诺或   担保。它们在某些情况下可能效果很好但在其他情况下则不然   GC可能无法始终遵守它们。

     

或者,可以指定年轻一代的大小   明确地影响疏散暂停时间:

     

-XX:+ G1YoungGenSize = 512m(年轻一代512兆)

     

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

     

最后,要充分发挥G1的作用,请尝试设置这两个   默认情况下当前禁用的参数,因为它们可能   发现罕见的种族情况:

     

-XX:+ G1ParallelRSetUpdatingEnabled -XX:+ G1ParallelRSetScanningEnabled

     

还有一点需要注意的是,与其他相比,G1非常冗长   设置-XX:+ PrintGCDetails时的HotSpot GC。这是因为它打印   每个GC线程时序和其他信息在分析中非常有用   和故障排除。如果您想要更简洁的GC日志,请切换   使用-verbosegc(虽然建议更详细   获得GC日志)。

我还发现this文章非常有助于理解G1的内容。

更多信息here

答案 3 :(得分:13)

1。 G1是Java 7(...)

中的默认收集器

this Java 5 page上的规则仍然适用于Java 7(以及AFAIK,Java 8):

  

在运行服务器VM的server-class台机器上,垃圾收集器(GC)已从先前的串行收集器(-XX:+ UseSerialGC)更改为并行收集器(-XX:+ UseParallelGC)。

但也要考虑:

  • 64位JVM没有-client VM,所以总是“服务器类”
  • 从Java 7开始,使用-XX:+ UseParallelGC(无论是设置还是暗示)还暗示-XX:+ UseParallelOldGC(即除非明确禁用)

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

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

1。 (...)如何激活G1?

从Java 7开始,只需-XX:+UseG1GC。也许你感兴趣的是when

  

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

     
      
  • 超过50%的Java堆被实时数据占用。
  •   
  • 对象分配率或促销率差异很大。
  •   
  • 不期望的长垃圾收集或压缩暂停(超过0.5到1秒)
  •   

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

我自己并没有使用G1,但I gather它坚持使用与调整其他并行收集器相同的基本“吞吐量/人体工程学”标志。根据我对并行GC的经验,-XX:GCTimeRatio一直是提供预期速度 - 内存权衡的关键因素。 YMMV。

列出了特定于G1的选项here

3。 Java 7中的(...)cms或并行收集器是否有变化?

不知道,but...

  

G1计划作为Concurrent Mark-Sweep Collector(CMS)的长期替代品

4。我在哪里可以找到有关Java 7中垃圾收集的好文档?

找到它可能是一种痛苦,不是吗?可能我发现的最好的“中心”页面是这个:

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

需要进行一些深度阅读,但如果您需要进行一些调整,则值得花时间。特别有见地的是:Garbage Collector Ergonomics

答案 4 :(得分:8)

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

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

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

有很多。有关完整信息,请查看此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%。当您增加或减少百分比时,请确保将总Java堆调整相同的数量。

您已重新配置了许多G1GC参数,如果您按照上述文档页面进行操作,则不需要这些参数。请交叉检查以上建议,尤其是 ParallelGCThreads ConcGCThreads ,这些建议将基于您的CPU核心。删除不必要参数的重新配置。

来自oracle的

Recommendations

评估和调整G1 GC时,请牢记以下建议:

  1. 年轻代大小:避免使用-Xmn选项或任何或其他相关选项(例如-XX:NewRatio)明确设置年轻代的大小。 修复年轻一代的大小会覆盖目标暂停时间目标

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

  3.   
        
    1. 是否对其他收集器(如cms或Java 7中的并行收集器)进行了更改?
    2.   

    Java 7有一些变化。看看这个article

      
        
    1. 我在哪里可以找到有关Java 7垃圾收集的优秀文档?
    2.   

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

    Java G1 garbage collection in production

答案 5 :(得分:2)

http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html上提供的文档(Wojtek提供的链接)似乎是唯一的官方链接信息,但信息似乎已过时,因为那里提到的一些标志仅在测试版本中可用,它们没有生产版本中存在的时间更长。 Oracle的某些人应该提供有关G1 GC的一些更新文档。

答案 6 :(得分:2)

没有G1不是jdk 1.7.0_02中的默认垃圾收集器。 默认的垃圾收集器取决于计算机的类。 如果计算机属于Server类,则默认垃圾回收器为吞吐量收集器。 如果该机器是Client类,则默认的垃圾收集器是Serial Collector。

答案 7 :(得分:0)

默认情况下,你并不想使用G1收藏家,因为它并不比其他收藏家好。它只适用于特殊用途。

在低延迟应用程序中,它比CMS稍微好一点,因为它有一点点更短,更可预测的暂停时间。作为交换,吞吐量比CMS更糟糕。

因此,只有延迟很重要才有用,但吞吐量并不重要。如果两者都很重要,那么请留在CMS。