我在 Linux 服务器 2.6.32-504.el6.x86_64 (RHEL) 上运行 Java7(Java HotSpot(TM) 64 位服务器虚拟机(内部版本 24.76-b04,混合模式));启用了几个 GC 开关如下所示。
问题似乎是暂停应用程序线程时时间显着增加(> 3Sec);根据安全点统计,它似乎与 vmop 操作有关。
我观察到 GC 和任何分配失败都没有太多开销,在程序执行期间只发生了少量收集。下面粘贴的 GC 日志包含来自 GC 的引用,就在应用程序线程暂停时间超过 3 秒之前,GC 显示了实际延迟。
问题
这个时间下沉是否与服务器卡住或没有响应有关,这是基于假设实时花费 3.02 秒并且没有迹象表明 GC 导致的任何开销。 ([Times: user=0.02 sys=0.00, real=3.02 secs])
是否有可用于监控系统响应的实用程序,或者是否有任何推荐的算法可用于测量服务器响应
什么导致 vmop 时间增加?
JVM 在启动垃圾回收时是否执行任何磁盘 IO;换句话说,在安全点暂停应用程序线程之前,JVM 是否执行任何磁盘 IO?或者在 GC 期间具有高 diskIO Activity 的系统是否会导致暂停应用程序线程的延迟。
服务器配置:
请注意,有多个应用程序在此服务器上运行,这不是上述应用程序的专用服务器。
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
如有任何意见,我们将不胜感激,如果您需要任何进一步的详细信息,请告诉我。
最佳答案
- 停止线程所花费的时间通常是您的应用没有响应的时间。所以是的,我希望看到应用程序挂起。
- 你试过 jhiccup 了吗?
- (和 4.)我想到了以下内容:http://www.evanjones.ca/jvm-mmap-pause.html .它描述了在 GC 期间写入 hsperf 数据的停顿(“真正的”暂停)。还有一个重现案例,您可以在自己的机器上试用。
关于java - 执行 GC 时,在安全点应用程序线程暂停期间导致 vmop 时间增加的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29535039/