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

标签 java linux performance garbage-collection jvm

我在 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 显示了实际延迟。

问题

  1. 这个时间下沉是否与服务器卡住或没有响应有关,这是基于假设实时花费 3.02 秒并且没有迹象表明 GC 导致的任何开销。 ([Times: user=0.02 sys=0.00, real=3.02 secs])

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

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

  4. 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

如有任何意见,我们将不胜感激,如果您需要任何进一步的详细信息,请告诉我。

最佳答案

  1. 停止线程所花费的时间通常是您的应用没有响应的时间。所以是的,我希望看到应用程序挂起。
  2. 你试过 jhiccup 了吗?
  3. (和 4.)我想到了以下内容:http://www.evanjones.ca/jvm-mmap-pause.html .它描述了在 GC 期间写入 hsperf 数据的停顿(“真正的”暂停)。还有一个重现案例,您可以在自己的机器上试用。

关于java - 执行 GC 时,在安全点应用程序线程暂停期间导致 vmop 时间增加的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29535039/

相关文章:

c++ - 64位架构优化

java - 我需要在java中检索SQL Server对象信息

java - Egit 与 Eclipse Galileo 和 Eclipse Helios 兼容吗?

c++ - cURL - Linux 上的 "hanging"套接字连接

linux - awk - 作为数字和 | 组合的定界符(管道)不工作

c# - 内存中的 LINQ 性能

java - 如何在struts2 junit4测试用例中发布请求中的json

java - 更新对象列表中对象的值

Linux命令的Python功能测试

performance - Meteor登录和注销很慢