Java NIO选择器挂起(jdk1.6_20)

时间:2011-08-07 11:07:34

标签: java nio

我在jdk1.6_20上使用Linux 2.6。我正在观察一种行为,在调用Selector.select(timeout)之后,NIO Selector无法在超时(timeout=5 sec)内唤醒。它返回很晚,几秒钟延迟(2~10秒)。这似乎在应用程序启动时间的最初几分钟内经常发生,并在以后稳定下来。由于我们的服务器与客户端心跳加速,因此选择器未能按时唤醒会导致心跳错过,并且对等方断开连接。

任何帮助表示赞赏。感谢。

4 个答案:

答案 0 :(得分:2)

来自Selector.select(long)的Javadoc:

  

这种方法不提供实时保证:它安排了   超时就好像通过调用Object.wait(long)方法一样。

由于应用程序的启动时间可能会对系统造成很大压力,这可能会导致唤醒延迟。

对于解决方案:切换到Selector.selectNow()作为非阻塞操作并处理应用程序代码中的重试。

答案 1 :(得分:0)

timeout是什么并不重要,一旦客户端连接,选择器应立即唤醒。因此,你有一些更严重的错误。

答案 2 :(得分:0)

  

无法在超时内唤醒(超时= 5秒)。

它不应该'在超时内唤醒'。它应该在超时到期后唤醒如果您应该在5秒内发送心跳,则5秒的超时时间太长。在这种情况下,我会把它设为2.5秒。

答案 3 :(得分:0)

嗯...实际上故事并没有就此止步..我们没有使用增量cms ..因此在并发阶段它没有放弃cpu ...我们在同一主机上有2个应用服务器,有16个内核除了应用程序线程之外,每个都有4个并行CMS线程,其中大约有45到60个。因此,最有可能出现CPU饥饿的可能性,特别是因为我们看到每次选择器被延迟时它都会在100~200毫秒之后立即出现。并发标记阶段..