3

ご挨拶

Ubuntu8.04 の Java6 の Tomcat6 で webapp を実行しています。このアプリのメイン サーブレットは、次の簡単なコードで ServerSocket を開きます。

ServerSocket serverSocket = new ServerSocket(6767);

Socket xmlSocket = serverSocket.accept();        

もちろん、これは別のスレッドで実行され、必要な try-catch ブロックが使用されます。

Tomcat を起動すると、すぐに CPU 負荷が 100% になり、クライアントがポート 6767 に接続するまでその状態が続きます。クライアントが接続されている限り、負荷は 0% になります。クライアントが切断されるとすぐに、負荷は 100% に戻ります。

誰がこれが何について教えてくれますか?

ありがとう!

解決:

以下の両方の回答は非常に役に立ちました。この問題は、実際には ServerSocket とは関係ありませんでしたが、アプリのまったく別のスレッドでのスリープレス while ループと関係がありましたが、クライアントが接続されているかどうかにも依存していました。

JDK コマンド「jstack」でアクティブなスレッドを特定できたので、ランナウェイ ループのあるスレッドを簡単に見つけることができました。

助けてくれてありがとう!:)

4

2 に答える 2

2

おそらく、何が起こっているのかを理解する最も簡単な方法は、100% で実行されるのを待ち、Ctrl-Break(またはSendSignalなどを使用して) スレッド ダンプを生成することです。一連のスレッドとその状態を取得すると、どのスレッドが実行されているか、コード内のどこにあるかが明確になります。

于 2010-02-28T12:42:30.743 に答える
1

クライアントが切断されるとすぐに、負荷は 100% に戻ります。

これは通常、while loopsleep() を含まない " " の場合です。説明については、このスレッド
を 参照してください。

例:

try
{
  while (m_flagRunUserThreadManager)
  {
    try
    {
      m_listenSocket.setSoTimeout(10000);
      Socket clientSocket = m_listenSocket.accept();
      //create a thread for client
      MyClientHandler clientHandler = new ClientHandler(clientSocket);
      clientHandler.setPriority(Thread.MIN_PRIORITY);
      clientHandler.start(); 

    }
    catch(SocketTimeoutException excp)
    {
      String strError = "No requests for 10 Sec.";
      //display this message    
    }
  }
}
catch(IOException excp)
{
    // display the exception
}

これはwhile loop、特に試行が失敗した場合に、スリープなしでパスを通過するためです。
どこかでスリープする必要があるため、他のスレッド/プロセスがチャンスを得ます。それか、すでに失敗したクライアントで試行を続けないでください。

于 2010-02-28T12:40:07.160 に答える