当前位置: 首页 > 知识库问答 >
问题:

带有初始标记的G1GC长暂停

桓智敏
2023-03-14

用j7u5,G1GC

"-Xms3200m-Xmx3200m-XX: UseG1GC-XX: ParallelGCThread=14-XX: ConcGCThread=4-XX: MaxGCPauseMillis=40-XX: NewRatio=2-XX: SurvivorRatio=10-XX: PrintGC-XX: PrintGCDateStamps"

对于给定的性能测试,可以预见,我的应用程序在运行5小时后会出现长时间的暂停。除了这个大的(也是唯一的),还有小的初始标记阶段。

任何建议来弄清楚这个长暂停发生了什么,以及如何调整它以避免影响延迟目标(百分位数98%, 99.999%)的如此长的暂停?

2012-12-22T09:48:57.966+0000: [GC pause (young) 2436M->1460M(3200M), 0.0627090 secs]
2012-12-22T09:49:07.295+0000: [GC pause (young) 2458M->1481M(3200M), 0.0871760 secs]
2012-12-22T09:49:18.905+0000: [GC pause (young) 2479M->1503M(3200M), 0.0930280 secs]
2012-12-22T09:49:32.366+0000: [GC pause (young) 2501M->1524M(3200M), 0.0827900 secs]
2012-12-22T09:49:44.576+0000: [GC pause (young) (initial-mark) 2522M->1546M(3200M), 3.4979530 secs]
2012-12-22T09:49:48.074+0000: [GC concurrent-root-region-scan-start]
2012-12-22T09:49:48.079+0000: [GC concurrent-root-region-scan-end, 0.0056590]
2012-12-22T09:49:48.080+0000: [GC concurrent-mark-start]
2012-12-22T09:49:48.173+0000: [GC concurrent-mark-end, 0.0932560 sec]
2012-12-22T09:49:48.180+0000: [GC remark, 0.0470160 secs]
2012-12-22T09:49:48.232+0000: [GC cleanup 1585M->944M(3200M), 0.0180490 secs]
2012-12-22T09:49:48.251+0000: [GC concurrent-cleanup-start]
2012-12-22T09:49:48.255+0000: [GC concurrent-cleanup-end, 0.0047270]

共有2个答案

通京
2023-03-14

G1 GC是一个具有默认值的自适应垃圾收集器,使其无需修改即可高效工作。有关更多详细信息,请参阅下面的问题。

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

如果您遵循oracle推荐的上述建议:

>

  • 删除以下参数

    -XX:SurvivorRatio=10 
    

    与默认值200 ms相比,MaxGCPauseMillis=40太过激进。有一个合理的暂停时间目标。

    根据服务器中CPU内核的数量,根据建议更改-XX:ParallelGCThreads=14-XX:congcthreads=4

  • 淳于健
    2023-03-14

    对于日志记录,请使用-XX:PrintGCTimeStamps-XX:PrintGCApplicationStoppedTime-XX:PrintGCApplicationConcurrentTime更好地了解问题和瓶颈

    建议在G1GC中使用-XX:UnlockExperimentalVMOptions-XX:AggressiveOpts-XX:DoEscapeAnalysis-XX:UseCompressedOops选项(如果本机/服务器支持这些选项)

    另外,请将-XX:GCPauseIntervalMillis=VALUE-XX:MaxGCPauseMillis=VALUE组合使用(它将控制暂停,最好通过执行一些R

    -XX:NewRatio参数的默认值是40,因此最好是40或大于40,例如-XX:NewRatio=50

     类似资料:
    • 我有一个类,我想用在另一个视图中设置的绑定变量初始化它。 查看- 需要使用 @Binding var $numberofNumbers 初始化的类 - init语句显然给出了一个错误,即self未初始化,而实例var用于初始化,这是不允许的。 我该如何避免这种情况?需要使用用户在第一个视图中输入的编号初始化该类。我在这里写了大概的代码,所以请忽略任何打字错误。

    • 我想在每个文本之后使用jsoup提取一个文本。有没有办法选择它? 示例代码如下: 当它完成时,它会创建自动id示例id=123

    • GC设置为: 最小、最大、总JVM大小(-xms-xmx)

    • 问题内容: 我目前正在开发一个Ionic Framework(AngularJS)项目,该项目使用地理位置和Google Maps显示用户的位置。 我正在尝试向用户显示地理位置以及该区域周围的多个标记。 我的地理位置已正常运行,但似乎无法添加多个标记。 地点 控制器 问题答案:

    • 问题内容: 我不是Java的新手,但是我对垃圾收集只了解一点点。现在,我想通过一些实践经验来改变这种状况。我的目标是在0.3秒以下的延迟,或者在极端情况下0.5也可以。 我有一个带有-Xmx50gb(-Xms50gb)的应用程序,并设置了以下其他GC选项: 但是现在由于垃圾回收,尽管偶尔有足够的可用内存,但我偶尔会在5秒内停顿很长时间。我发现的原因之一: 为什么GCG1仍为此做一个“停止世界”?(