我在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显示实际延迟。
问题
-
此时间接收器是否与服务器冻结或没有响应有关,这是基于实时时间花费3.02秒的假设,并且没有迹象表明GC会产生任何开销。([时间:用户=0.02系统=0.00,实际=3.02秒])
-
是否有任何可用的实用程序可以监控系统响应,或者是否有任何推荐的算法可以用于测量服务器响应
-
是什么导致vmop时间增加?
-
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
如果您对此有任何意见,我们将不胜感激,如果您需要任何进一步的细节,请告诉我。
- 停止线程所花费的时间通常是应用程序没有响应的时间。所以,是的,我希望看到应用程序挂起
- 你试过j打嗝吗
- (和4.)我想到了一些事情:http://www.evanjones.ca/jvm-mmap-pause.html.它描述了GC期间写入hsperf数据的暂停("真正的"暂停)。还有一个repro案例,你可以在你的机器上试试