代码之家  ›  专栏  ›  技术社区  ›  Casey Jordan

如何解释Java G1 GC暂停时间原因

  •  3
  • Casey Jordan  · 技术社区  · 7 年前

    我们的实例正在被监控,我的信息包含在以下图表中:

    12 second stop the world pause Heap allocations

    我们有另一个监视工具ping JVM,我让它报告JVM在大约同一时间有12秒没有响应。

    这让我想到了这个问题,该怎么办。服务器上的负载非常低,因此这种情况并不经常发生,但似乎在几个小时后,堆会不断增长,然后出现一个巨大的GC事件,可能会导致严重的问题。下面是我们用于GC的配置:

       wrapper.java.additional.40=-XX:+UseG1GC
    
       wrapper.java.additional.44=-XX:+ScavengeBeforeFullGC
    
    
       wrapper.java.additional.50=-XX:+PrintGCCause
       wrapper.java.additional.51=-XX:+PrintGCDetails
       wrapper.java.additional.52=-XX:+PrintGCTimeStamps
       wrapper.java.additional.53=-XX:+PrintGCApplicationStoppedTime
       wrapper.java.additional.54=-XX:+PrintGCApplicationConcurrentTime
       wrapper.java.additional.55=-verbose:gc
       wrapper.java.additional.56=-Xloggc:../../../logs/gc.log
       wrapper.java.additional.57-XX:+UseGCLogFileRotation
       wrapper.java.additional.58-XX:NumberOfGCLogFiles=10
       wrapper.java.additional.59-XX:GCLogFileSize=100M
       wrapper.java.additional.60=-XX:+PrintHeapAtGC
       wrapper.java.additional.61=-XX:+PrintTenuringDistribution
       wrapper.java.additional.62=-XX:+UseCompressedClassPointers
       wrapper.java.additional.63=-XX:+UseCompressedOops
    

    谁能给我指一下正确的方向吗。谢谢

    GCEasy分析: http://gceasy.io/my-gc-report.jsp?p=c2hhcmVkLzIwMTcvMDYvMjcvLS1nYyAoMSkubG9nLnppcC0tMTgtNDEtNDA=

    更新:元空间图

    enter image description here

    https://dl.dropboxusercontent.com/u/3642047/gc.log.zip

    1 回复  |  直到 7 年前
        1
  •  3
  •   apangin    7 年前

    我在您的GC日志中看到了至少两个问题:

    1. System.gc() Runtime.getRuntme().gc() .每个约10秒长:

      277042.600: [Full GC (System.gc())  12G->1537M(5126M), 11.4203806 secs]
      

      您可能需要添加 -XX:+ExplicitGCInvokesConcurrent 要防止的JVM标志 阻止世界事件的发生。

      找到打电话的人也很有用 并且可能完全避免这个电话。为此,您可以修改 Runtime.gc 方法,通过添加代码来打印堆栈跟踪。然后重新编译 Runtime.java 并使用
      -Xbootclasspath/p:/path/to/yourpatch.jar

    2. 另一个问题是与GC无关的超长安全点同步暂停:

      5512447.686: Total time for which application threads were stopped: 16.4426008 seconds, Stopping threads took: 16.4414390 seconds
      

      这通常是由MappedByteBuffer I/O引起的,或者是因为Java进程开始交换到磁盘。看见 this this 关于类似问题的答案。