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

为什么“打印线程”vm op会导致应用程序中的长时间vm暂停?

闻人哲茂
2023-03-14

我正在使用-XX: PrintSafepoint统计、-XX: PrintGCApplication ationStopedTime和-XX: PrintGCApplication ationConrealtTime等运行jvm来调查gc暂停。我注意到

>

  • vm暂停比gc暂停大得多,占总数的90%。

    虽然大多数暂停都是低延迟的,但我发现有几次vm暂停让我的应用程序停止了很长时间。

    在使用PrintSafepoint统计标志的进一步调查中(如本博客所建议的:http://jpbempel.blogspot.in/2013/03/safety-first-safepoints.html),我发现一个特定的vm-op“打印线程”会导致长达4.5秒和1.3秒的暂停。

    我想知道是什么触发了这个vmop,为什么它占用了这么多时间。如果它有帮助,以下是我正在使用的所有jvm标志的列表:

    JAVA _ OPTS = " $ JAVA _ OPTS-XX:UseParallelOldGC "

    CATALINA _ OPTS = "-Xms2G-Xmx4G-XX:MaxPermSize = 256m-Xloggc:/path/to/Tomcat/Apache-Tomcat-8 . 0 . 18/logs/GC . log-XX:printgc details-XX:printgcstimestamps-XX:printtenuingdistribution-XX:printgapplicationstoppedtime-XX:printgapplicationconcurrenttime-XX:MaxNewSize = 1638m-XX:NewSize = 1638m-XX:PrintSafepointStatistics-XX:printgsafepointstatistics-XX

    应用程序停止时间输出(以 gc.log 为单位)(相关部分):

    1649.008: Application time: 0.0001730 seconds  
    1649.009: Total time for which application threads were stopped: 0.0003760 seconds  
    **1650.805**: Application time: 1.7963630 seconds  
    1655.315: Total time for which application threads were stopped: **4.5099710 seconds**  
    1655.315: Application time: 0.0000350 seconds  
    1655.316: Total time for which application threads were stopped: 0.0005540 seconds  
    1655.316: Application time: 0.0001600 seconds  
    

    catalina中相应的Safepoint统计数据。out(相关部分):

             vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
    1649.008: RevokeBias                       [     165          0              0    ]      [     0     0     0     0     0    ]  0   
    
             vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
    **1650.805**: PrintThreads                     [     168          0              0    ]      [     0     0     0     0  4509    ]  0   
    
             vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
    1655.315: PrintJNI                         [     168          0              0    ]      [     0     0     0     0     0    ]  0   
    

    应用程序线程停止4.5秒之前的最后时间戳是1650.805。此时间戳对应于catalina.out.中的“PrintThreadsvmop”,我已经在多个实例中验证了这一观察结果。大于1秒的暂停总是由“PrintThreadsvmop”引起的。

    提前致谢。

  • 共有1个答案

    柳玄裳
    2023-03-14

    你能告诉我更多关于PrintThreads vmop的信息吗,比如它是什么时候或者为什么被触发的?

    有几种方法可以触发它

    • 将SIGBREAK发送到进程/在控制台中点击Ctrl-Break
    • 从本机代码调用JVM_DumpAllStacks
    • 连接执行线程转储的java代理(探查器/监视工具)
    • 通过DiagnosticCommandMBean调用

    只是猜测,但是如果任何触发vmop的东西都是通过网络连接写入的,而另一端的任何东西都很慢,那么这可能会导致整个VM暂停。

     类似资料:
    • 问题内容: 这段代码: 使我的计算机挂起5秒钟,然后打印出0-9,而不是每半秒打印一次数字。难道我做错了什么? 问题答案: ,默认情况下,在内部打印到并缓冲要打印的输出。 通常是否由文件确定输出是否被缓冲,但是如果关键字参数为true,则将强制刷新流。 在版本3.3中更改:添加了关键字参数。 报价文件, 交互式时,标准流是行缓冲的。否则,它们像常规文本文件一样被块缓冲。 因此,就您而言,您需要像这

    • 我们正在使用一个3站点,每个站点3个节点的Cassandra 1.1.12集群,每个节点分配了8GB内存。我们定期在节点上看到长时间的GC暂停,这扰乱了我们的应用程序实时要求。我们运行的系统是8个核心系统,具有24GB内存。 我们已经看到了120秒的暂停,它会停止世界GC。 我们在JDK 1.7.0_04上运行这些标志 以下是导致长时间暂停的详细GC日志: 我还设置了一个夜间作业,强制GC在凌晨2

    • 当我创建一个简单的非多线程JavaFX应用程序并启动它时,该应用程序会创建一些线程(JavaFXApplicationThread、JavaFXLauncher等)。这些线程中的大多数都已命名,但在我的所有JavaFX应用程序中都有一个未命名的线程(“线程-1”或“线程-2”)。我绝对不会创建自己的线程,因为我尝试启动Hello World JavaFX应用程序(由IDEA生成),其中也包含“线程

    • 我希望下面显示一个绘图,但我没有看到绘图,解释器只是挂起(我的后端报告自己为)。 我如何让情节显示? 我正在运行一个有很多迭代的模拟,并希望每1000次迭代更新我的图,以便我可以监控我的模拟是如何发展的。 下面的伪代码: 在主线程中使用绘图可能会导致绘图GUI挂起/崩溃,因为我还有其他工作要做。所以这个想法是在一个单独的线程中进行绘图。 我看到过使用进程而不是线程的建议(例如这里)。但是当我的模拟

    • 我有一个在Tomcat7上运行的Spring3.0WebMVC应用程序。在应用程序启动时,我启动一个后台线程来加载内存缓存,其中包含来自数据库的记录。该线程从数据库加载所有数据通常需要一个多小时。在同一个应用程序中,我有一个@Controller注释类,它公开了一个REST接口,客户端可以通过该接口从加载的缓存中获取对象。 我们的要求之一是,在数据加载完成之前发出的任何REST请求都将立即向客户端

    • 我正在http://www.python-course.eu/threads.php的帮助下学习python线程处理。这段代码的解释让我很困惑: 代码: 读取num_thread的值 一个新的int实例将增加或减少1(我认为一个新的int对象将被创建) 将新值分配给num_threads 像这样的错误发生在增量赋值的情况下: 第一个线程读取变量num_threads,它的值仍然是0。令人困惑的是: