是什么导致在执行GC时安全点应用程序线程暂停期间vmop时间增加



我在Linux Server 2.6.32-504.el6.x86_64(RHEL)上运行Java7(Java HotSpot(TM)64位服务器虚拟机(内部版本24.76-b04,混合模式);启用的GC开关很少,如下所示。

问题似乎是暂停应用程序线程时时间显著增加(>3Sec);根据安全点统计数据,它似乎与vmop操作有关。

我观察到,GC和任何分配失败都不会带来太大的开销,只有在程序执行期间会发生小的收集。下面粘贴的GC日志包含在应用程序线程暂停时间超过3Sec之前GC的引用,GC显示实际延迟。

问题

  1. 此时间接收器是否与服务器冻结或没有响应有关,这是基于实时时间花费3.02秒的假设,并且没有迹象表明GC会产生任何开销。([时间:用户=0.02系统=0.00,实际=3.02秒])

  2. 是否有任何可用的实用程序可以监控系统响应,或者是否有任何推荐的算法可以用于测量服务器响应

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

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

服务器配置:

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

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. 停止线程所花费的时间通常是应用程序没有响应的时间。所以,是的,我希望看到应用程序挂起
  2. 你试过j打嗝吗
  3. (和4.)我想到了一些事情:http://www.evanjones.ca/jvm-mmap-pause.html.它描述了GC期间写入hsperf数据的暂停("真正的"暂停)。还有一个repro案例,你可以在你的机器上试试

最新更新