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

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

袁晋鹏
2023-03-14

当使用G1收集器时,我们一直在与似乎是长期停止的世界停顿作斗争。我已经通读了Oracle文档,但仍然难以确定如何解释导致长时间停顿的原因以及如何处理。(下面是GC日志)

我们的实例正在被监视,下面的图中包含了信息:

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

   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

更新:元空间图

共有1个答案

狄新翰
2023-03-14

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

>

  • system.gc()runtime.getruntme().gc()显式调用了4个完整集合。每一个大约10秒长:

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

    您可能需要添加-xx:+explicitGCInvokesConcurrentJVM标志,以防止System.gc()导致停止世界事件。

    另一个问题是与GC无关的非常长的safepoint同步暂停:

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

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

  •  类似资料:
    • 问题内容: 最近,我开始将ucos-ii移植到Ubuntu PC。 众所周知,在ucos-ii中无法通过在pthread的回调函数中的“ while”循环中添加一个标记来执行暂停和恢复来模拟“进程”,以执行暂停和恢复操作(类似于下面的解决方案)。因为ucos- ii中的“进程”可以随时暂停或恢复! 我在下面的网站上找到了一种解决方案,但是由于过时而无法构建。它使用Linux中的进程来模拟ucos-

    • 我正在从数据库中提取数据,以检查我是否有可用的系统资源来处理来自KafkaListener的进一步消息。如果我的条件没有满足,那么我希望@KafkaListener暂停,当条件满足时,我希望@KafkaListener恢复。我如何在SpringKafka实现这一点? 另外,为特定分区暂停消费者有什么缺点吗?

    • 你可以通过剪辑AnimationClip、操作AnimationAction、混合器AnimationMixer完成一些播放效果。 播放/暂停(.paused属性) <button onclick="pause()" type="button" style="position: absolute;padding: 10px;">暂停/继续</button> <script> // 暂停继续播放

    • 问题内容: 当我打开自定义JDialog以及关闭对话框以再次继续时,如何使我的应用程序暂停。 问题答案: 只需使用: 我通常从的构造函数中调用它。 请参阅中的Javadocs 。 http://java.sun.com/javase/6/docs/api/java/awt/Dialog.html#setModal(boolean) 这将导致执行在当前线程上阻塞,直到对话框关闭。 或者,您可以使用:

    • 我正在编写一个java程序来解析字幕文件中的文本。 这个想法是,每当我在播放电影时遇到字幕中我不知道的单词时,我暂停视频并打开我的客户端,然后客户端访问经过的时间,获取句子,并使用一些离线词典显示该句子中所有单词的含义。 我只想“在那一刻得到弹性时间”——我认为这是最基本的事情,所以我不想看所有关于VLC的文档(我试过了,但我觉得它们太复杂了,我对进一步为VLC开源做贡献没有兴趣)

    • 我有一个Android应用程序,它使用谷歌admob网络显示间隙广告。admob的优点是,它的活动是独立的。我可以在我的MainActivity中加载广告,只要admob准备好了广告,它就会显示出来,即使我不再在MainActivity中。我已经使用了isLoaded()方法来显示广告,这占了90%的时间。 但其他10%的情况并非如此。有些活动应该保持无广告状态,因为广告会降低游戏质量。如果手机速