Linuxプラットフォームでソケットを使用するときにファイル記述子のリークはありますか?

StackOverflow https://stackoverflow.com/questions/429762

質問

インスタンスを呼び出してソケットを開閉した場合

Socket s = new Socket( ... );
s.setReuseAddress(true);
in = s.getInputStream();
...
in.close(); 
s.close();      

Linuxは、このソケットがまだ開いているか、少なくとも接続のファイル記述子が存在することを示しています。 lsofによってこのプロセスの開いているファイルを照会すると、閉じられた接続のエントリがあります。

COMMAND  PID   USER   FD   TYPE DEVICE     SIZE   NODE NAME
java    9268 user    5u  sock    0,4           93417 can't identify protocol

このエントリは、プログラムが終了するまで残ります。最終的にソケットを閉じる他の方法はありますか? 私のJavaアプリケーションが多くのファイル記述子をブロックするのではないかと少し心配です。これは可能ですか?または、ReuseAdressが設定されていても、javaはこれらのソケットを保持して再利用しますか?

役に立ちましたか?

解決

これらのソケットがすべてTIME_WAIT状態にある場合、これは少なくともしばらくの間は正常です。 netstatで確認してください。ソケットが数分間ぶらぶらして、新しいソケット用のポートを再利用する前に、ソケットからのストラグデータが正常に破棄されることを確認するのが一般的です。

他のヒント

/proc/<pid>/fdを確認することもできます。ディレクトリには、現在開いているすべてのファイル記述子が含まれます。ソケットを閉じた後にファイルが消えても、問題が発生することはありません(少なくともファイル記述子では:)。

それはあなたのプログラムの問題ではないと思います。

SUN_Javaでは、ソケット関連のネイティブライブラリがロードされると、MAGIC_SOCK fdが作成されます。

MAGIC_SOCKに書き込むとConnect Rest Exceptionが発生し、MAGIC_SOCKに読み取るとEOFが発生しました。

magic_sockのピアは完全に閉じられており、magic_sock自体はhalf_closedであり、状態は<!> quot;プロトコルを識別できません<!> quot;のままです。

おそらく、他のプロトコルのソケット(<!> quot;プロトコルを識別できません<!> quot; eh?)実装内で何かをするために内部で使用され、最初のソケットで作成されます。

ソケットの作成とクローズを繰り返して、これらのソケットが本当に持続するかどうかを確認しましたか?これは1回限りのようです。

Javaはおそらく内部で多くのことのためにソケットを使用します-それらはUnix、Netlink(Linuxの場合)、または他のタイプのソケットかもしれません。

小さなbashスクリプトを作成して、特定のアプリまたはpidに対して開かれたソケットを監視し、Javaアプリのテスト中に実行できるようにします。

ソケットはlinux / unixの世界で非常に使用されており、この種の問題はすぐに発生するので、とにかくこのことには何らかのリークがあるとは思いません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top