8

こんにちは私は非常に醜い問題を抱えています:java.net.SocketException:使用可能なバッファスペースがありません(最大接続に達しましたか?)これはクライアントサーバーアプリです。クライアントはWindowsXPSP2 32bで、2つのネットカードコアデュオがあります。Java1.6。u7。アプリケーションでは、ローカル通信用にカップルサーバーソケットが開いており、rmiからjbossサーバーへのクライアントソケットがいくつかあります。

数時間/日後!サーバーとの通信を行うために新しいクライアントソケットを開くことができません。サーバーソケットは引き続き機能します。

Windows netstatは、130から150の接続を示します。手動で試してみると、約3500の接続後にバッファを使い果たしました!

私は試した:

  • 使用するすべてのソケットをチェックして、それも閉じます。
  • 開いている接続を監視するには、バックグラウンドでnetstatを実行します
  • ウイルススキャンを実行してマルウェアを見つけます
  • javaを1.6u16に更新します
  • 2番目のネットワークインターフェイスを無効にする

  • Javaを再起動すると、新しい接続を開くことができます。

    全体の例外:

    cause:javax.naming.CommunicationException:サーバーIP:1099への接続に失敗しました[ルート例外はjavax.naming.ServiceUnavailableException:サーバーIP:1099への接続に失敗しました[Roo
    例外はjava.net.SocketExceptionです:使用可能なバッファスペースがありません(最大接続に達しましたか?):JVM_Bind]]
    2009-08-03 09:13:18,968 DEBUG [スレッド-9]-スタックトレース:
    2009-08-03 09:13:18,968デバッグ[スレッド-9]-org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1562)
    2009-08-03 09:13:18,968デバッグ[スレッド-9]-org.jnp.interfaces.NamingContext.lookup(NamingContext.java:634)
    2009-08-03 09:13:18,968デバッグ[スレッド-9]-org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
    2009-08-03 09:13:18,968デバッグ[スレッド-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
    も接続を開きますしかし、その後ストリームを要求すると、接続はストリームと一緒に閉じられます(Stephenに感謝します)。

    OS-
    異なるJava(1.5、1.6、1.7)を使用します-
    新しいドライバーをインストール
    します-netstatを使用し、バックグラウンドでトラフィックを監視します(スクリプトを使用します。はい、win xpはスクリプトを非常にうまく実行できます)。必要に応じて、高度なパケットスニファ(wire shark?)を使用します。
    --win xpには同時接続の制限があります、それらもチェックしてください(google)
    -ウイルスとマルウェアを何度もチェックします(プライベートネットワークでも!)

    于 2009-08-25T12:00:39.013 に答える
    0

    このリンクで提供されるアドバイスを読んだ後!短すぎる時間でisDisplayed()を頻繁に使用していると判断できました。したがって、isDisplayedの呼び出しの間に5ミリ秒の待機を設定しました。これにより、ソケット例外の問題が修正されました。

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

    リンクに記載されているように、この待機時間が十分でない場合に備えて、trycatchを挿入する必要があります。

    于 2014-02-25T21:19:32.260 に答える