FULL GC有可能导致JVM暂停1分钟以上吗?

qianhd 2011-12-30
与另外个程序交互有个心跳检测, 15s/次, 31s没有收到心跳检测的返回消息就认为连接断了,

现在遇到一个诡异问题, 不知什么原因 导致程序中1分多钟内日志无任何输出, 接着就是检测到超时, 可是接着连续输出多次发送keepalive.

发送keepalive就是很简单的java.util.Timer, 速率固定

启动参数
-Xms16m -Xmx128m -XX:+HeapDumpOnOutOfMemoryError

程序启动时间[15:55:10.225] [23.12.2011]


第一次
[09:51:16.288] [26.12.2011] [Thread-14][DEBUG] Keepalive receiver started or reseted.

[09:53:26.819] [26.12.2011] [Timer-9197][ERROR] Keepalive timeout reached

[09:53:26.819] [26.12.2011] [Timer-9][DEBUG] Keepalive sent

[09:53:26.819] [26.12.2011] [Timer-9][DEBUG] Keepalive sent

[09:53:26.819] [26.12.2011] [Timer-9][DEBUG] Keepalive sent

[09:53:26.819] [26.12.2011] [Timer-9][DEBUG] Keepalive sent

[09:53:26.819] [26.12.2011] [Timer-9][DEBUG] Keepalive sent

[09:53:26.819] [26.12.2011] [Timer-9][DEBUG] Keepalive sent

[09:53:26.819] [26.12.2011] [Timer-9][DEBUG] Keepalive sent

[09:53:26.819] [26.12.2011] [Timer-9][DEBUG] Keepalive sent      

[09:53:26.819] [26.12.2011] [Timer-9197][DEBUG] Sent <Disconnect/>



重连启动后第二次
[09:57:17.053] [26.12.2011] [Thread-9207][DEBUG] Keepalive receiver started or reseted.

[09:58:29.381] [26.12.2011] [Timer-9259][ERROR] Keepalive timeout reached

[09:58:29.381] [26.12.2011] [Timer-9259][DEBUG] Sent <Disconnect/>

[09:58:29.397] [26.12.2011] [Timer-9200][DEBUG] Keepalive sent

[09:58:29.397] [26.12.2011] [Timer-9200][DEBUG] Keepalive sent

[09:58:29.397] [26.12.2011] [Timer-9200][DEBUG] Keepalive sent

[09:58:29.397] [26.12.2011] [Timer-9200][DEBUG] Keepalive sent
qianhd 2011-12-30
另外 -Xloggc 这个jvm的gc日志能以压缩的形式输出吗? 或者过滤一些.
RednaxelaFX 2011-12-30
GC暂停超过1分钟的情况不是没有,但以-Xmx128m的配置来看这个很诡异。
请问能使用 -XX:+PrintSafepointStatistics 来看看VM暂停的统计信息么?
一共是这几个参数:

  product(bool, PrintSafepointStatistics, false,                            \
          "print statistics about safepoint synchronization")               \
                                                                            \
  product(intx, PrintSafepointStatisticsCount, 300,                         \
          "total number of safepoint statistics collected "                 \
          "before printing them out")                                       \
                                                                            \
  product(intx, PrintSafepointStatisticsTimeout,  -1,                       \
          "print safepoint statistics only when safepoint takes"            \
          " more than PrintSafepointSatisticsTimeout in millis")            \
qianhd 2011-12-30
应该可以
但是这问题也就遇到过这一次  未必能重现
这地方只要出现过一次的问题 都能报bug

就连temp目录垃圾文件太多 导致程序里创建临时文件太慢 使得程序响应变慢 都能报个bug.
william_ai 2011-12-30
3分钟以内,但是频率不能太高了。
xiaoyu 2011-12-31
Threaddump 一下. 先看看有没有其他东西在block住... 对于2边网络, 也最好使用tcpdump看一下是否出现什么问题(是不是ARP失效等, 是不是发送, 接收缓冲区满了等等)...

x_root 2012-01-01
你可以将readTimeout时间设大点,这个问题我以前也遇到过,GC时间过长,导致服务端以为连接无效而关闭了。

不过你的设置-Xmx128m却导致GC要一分多钟却有点不可思议。
iaimstar 2012-01-04
Xmx128m 也能一分钟以上?你这fullgc是坑爹啊
moonese 2012-02-27
会不会是对方程序的问题? 最后查出原因了?
qianhd 2012-02-29
最终没有查出原因, 因为很难复现
这破烂货一般来说只要开3天以上, 就会有很多莫名其妙的问题. 所以建议用户不用就关掉
从上面的[Timer-9200]就可以看出代码质量有多少差
当然这破烂货不是我写的.
Global site tag (gtag.js) - Google Analytics