执行GC时,在安全点应用程序线程暂停期间导致vmop时间增加的原因

时间:2015-04-09 09:44:15

标签: java linux performance garbage-collection jvm

我在Linux Server 2.6.32-504.el6.x86_64(RHEL)上运行Java7(Java HotSpot(TM)64位服务器VM(内置24.76-b04,混合模式);启用了少量GC开关如下图所示。

暂停应用程序线程(> 3Sec)时问题似乎是时间的显着增加;并且基于safepointstatistics,它似乎与vmop操作有关。

我观察到由于GC没有太多开销,也没有任何分配失败,在程序执行期间只发生了少量收集。下面粘贴的GC日志包含在应用程序线程暂停时间超过3秒且GC显示实际延迟之前来自GC的引用。

问题

  1. 这个时间汇可能与服务器冻结或没有响应有关,这是基于假设实时花费3.02秒并且没有任何由于GC导致任何开销的迹象。 ([时间:用户= 0.02 sys = 0.00,实际= 3.02秒])

  2. 是否有可用于监控系统响应能力的实用程序,或者是否存在可用于衡量服务器响应性的推荐算法

  3. 是什么导致vmop时间增加?

  4. JVM在启动垃圾回收时是否执行任何磁盘IO;换句话说,在将应用程序线程暂停到安全点之前,JVM是否执行任何diskIO;或者GC期间具有高磁盘IO活动的系统会导致暂停应用程序线程的延迟。

  5. 服务器配置:

    请注意,此服务器上运行了多个应用程序,这不是上述应用程序的专用服务器。

    model name: Intel(R) Xeon(R) CPU X5365  @ 3.00GHz / 8 Core
    
                 total       used       free     shared    buffers     cached
    Mem:      24602892   22515868    2087024        244     165796   10801380
    -/+ buffers/cache:   11548692   13054200'
    

    启用了GC选项:

    -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/opt/swxsmf_fep/working/gk-gc-CMS.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime\
     -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+PrintGCApplicationConcurrentTime
    

    上一页GC(显示无问题)

    2015-04-08T19:05:24.622+0100: 522569.387: Application time: 16.4710580 seconds
    2015-04-08T19:05:24.622+0100: 522569.387: [GC2015-04-08T19:05:24.622+0100: 522569.387: [ParNew: 102798K->79K(115456K), 0.0018020 secs] 105218K->2499K(371776K), 0.0019090 secs] [Times: user=0.02 sys=0.00, rea
    l=0.00 secs]
    2015-04-08T19:05:24.624+0100: 522569.389: Total time for which application threads were stopped: 0.0021910 seconds
    

    GC,其中实时> 3秒

    vmop [threads: total initially_running wait_to_block]  [time: spin block sync cleanup vmop] page_trap_count
    522588.500: GenCollectForAllocation          [      22          0              0    ]      [     0     0     0     0  3019    ]  0
    
        2015-04-08T19:05:43.747+0100: 522588.512: Application time: 19.1232430 seconds
        2015-04-08T19:05:43.748+0100: 522588.512: [GC2015-04-08T19:05:46.765+0100: 522591.530: [ParNew: 102735K->77K(115456K), 0.0017640 secs] 105155K->2497K(371776K), 3.0195450 secs] [Times: user=0.02 sys=0.00, real=3.02 secs]
    2015-04-08T19:05:46.767+0100: 522591.532: Total time for which application threads were stopped: 3.0198060 seconds
    

    非常感谢您的任何意见,如果您需要任何进一步的细节,请告诉我。

1 个答案:

答案 0 :(得分:0)

  1. 停止线程的时间通常是您的应用没有响应的时间。所以,是的,我希望看到应用程序挂起。
  2. 你试过jhiccup吗?
  3. (和4.)这里有一些想到的东西:http://www.evanjones.ca/jvm-mmap-pause.html。它描述了在GC期间写入hsperf数据的停顿("真实"暂停)。还有一个你可以在机器上试用的复制案例。