8

嗨,我有一个非常丑陋的问题:java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?)它是客户端-服务器应用程序。客户端是 Windows XP SP2 32b,带有两个网卡核心双核。Java 1.6。u7。应用程序为本地通信打开了几个服务器套接字,并为 rmi 到 jboss 服务器打开了几个客户端套接字。

几个小时/几天后!我无法打开任何新的客户端套接字来与服务器进行通信。服务器套接字仍然有效。

Windows netstat 显示从 130 到 150 的连接。手动尝试时,我在 ~3500 个连接后耗尽了缓冲区!

我试过了:

  • 检查我们使用的每个套接字,我们也关闭它。
  • 在后台运行 netstat 以监控打开的连接
  • 运行病毒扫描以发现任何恶意软件
  • 将 java 更新到 1.6 u16
  • 禁用第二个网络接口

  • 重新启动 java 后,我就可以打开新连接。

    整个例外:

    原因:javax.naming.CommunicationException:无法连接到服务器 IP:1099 [根异常是 javax.naming.ServiceUnavailableException:无法连接到服务器 IP:1099 [Roo
    t 异常是 java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind]]
    2009-08-03 09:13:18,968 调试 [Thread-9] - 堆栈跟踪:
    2009-08-03 09:13:18,968 调试 [Thread-9] - org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1562)
    2009-08-03 09:13:18,968 调试 [Thread-9] - org.jnp.interfaces.NamingContext.lookup(NamingContext.java:634)
    2009-08-03 09:13:18,968 调试 [Thread-9] - org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
    2009-08-03 09:13:18,968 调试 [Thread-9] - javax.naming.InitialContext.lookup(未知来源)
    

    --edited
    我们终于解决了 snmp 服务器故障的问题。我在下面的评论中写下了我的笔记。感谢帮助。

    4

    3 回答 3

    3

    听起来您肯定会在您的应用程序中以某种方式泄漏套接字。

    • 检查您的代码是否总是关闭它打开的套接字......即使出现一些异常;即在一个finally块中关闭。
    • 如果您的代码使用 URL 连接,请确保它们断开连接。
    • 我不是专家,但您的代码应该关闭它的 InitialContext 对象吗?
    于 2009-08-04T12:16:05.443 回答
    1

    我们尝试(并成功)解决了问题。JAVA - 再次检查我们使用的每个套接字,如果需要,将它们注册到一些特殊的类中
    - 为每个打开套接字本身的类(例如 jboss 连接器)提供 SocketFactory 和 ServerSocketFactory
    - 检查打开的文件,最后关闭它们
    - URL 也打开连接,但是如果您在那之后要求流,连接将与流一起关闭(感谢斯蒂芬)。

    操作系统
    - 使用不同的 java(1.5、1.6、1.7)
    - 安装新驱动程序
    - 使用 netstat 并监控后台流量(使用脚本,是的 win xp 可以很好地执行脚本)。如果需要,请使用高级数据包嗅探器(钢丝鲨?)。
    - win xp 对并发连接有限制,请检查它们(谷歌)
    - 一次又一次地检查病毒和恶意软件(即使在专用网络上!)

    于 2009-08-25T12:00:39.013 回答
    0

    阅读此链接中提供的建议后!我能够确定我在太短的时间内过于频繁地使用 isDisplayed() 。因此,我在对 isDisplayed 的调用之间放置了 5 毫秒的等待时间。这解决了我的套接字异常问题。

        for (final WebElement person: persons){
            if (person.isDisplayed()){
                dosomething;
                sleep 5 milliseconds
            }
        }
    

    如链接中所述,您应该插入一个 try catch,以防此等待时间不够长。

    于 2014-02-25T21:19:32.260 回答