1

お客様のシステムの 1 つで、開いているファイルが多すぎるというエラーに直面しています。現在、FD 制限は最大に設定されており、これは週に 1 回発生しています。

lsof と netstat o/p を確認した後、BOUND 状態 (20K) のソケットが多すぎることがわかりました。この状態は一時的な状態であると理解しているため、実際に漏れている場所を見つけることができません。バインドされたソケットの 1 つを heapDump で見ると、次の GC 参照が表示されます

>java.net.InetSocketAddress
 >> sun.nio.ch.SocketChannelImpl
  >>>sun.nio.ch.SocketAdaptor
   >>>>java.net.SocksSocketImpl
    >>>>>java.lang.ref.Finalizer 

これを解決する方法がわかりません。同じことについて専門家の意見が必要ですか?

4

3 に答える 3

3

ソケットを確実に close() するために、それはファイナライザー スレッドから閉じられます。

ファイナライザー スレッドはシングル スレッドであり、これが低速で実行されている場合 (接続を正しく閉じていないなどの理由で)、ソケットをクリーンアップするよりも速くソケットを作成できます。

最初に確認することは、スタック ダンプを取得し、ファイナライザー スレッドが通常何を待機しているかを確認することです。次に、ソケット接続が終了したら、常にソケット接続を閉じていることを確認してください。ソケットは引き続きファイナライザー キューに追加されますが、既に閉じられていることを確認するのに時間はかかりません。

于 2012-07-25T15:55:11.850 に答える
1

ソケットがひどく漏れています。どこかで、finally ブロックでそれらを閉じていない場合があります。BOUND 状態から、どこかで new Socket() を呼び出してから connect() を呼び出し、失敗した場合はソケットを閉じていないと推測しますが、他にも多くの可能性があります。

于 2012-07-26T02:11:04.573 に答える
0

ヒントをありがとう、私たちは問題を掘り下げることができました。。実際、nioはunresovedAddress例外をスローしていました。その場合、ソケットリソースはクリーンアップされませんでしたが、IOExceptionが発生すると、すべてのリソースがクリーンアップされて解放され、UnresolvedAddressExceptionを処理するようになりました。。修正は簡単でしたが、問題を解決するのに時間がかかりました:)

于 2012-08-03T06:08:21.690 に答える