3

问候

我在 Ubuntu8.04 上的 Java6 上的 Tomcat6 上运行我的 webapp。这个应用程序的主 servlet 打开一个 ServerSocket,代码如下:

ServerSocket serverSocket = new ServerSocket(6767);

Socket xmlSocket = serverSocket.accept();        

当然,这在一个单独的线程中运行,并带有必要的 try-catch 块。

当我启动 Tomcat 时,它立即进入 100% CPU 负载并一直保持在那里,直到客户端连接到端口 6767。只要客户端连接,负载就会下降到 0%。一旦客户端断开连接,负载就会恢复到 100%。

谁能告诉我这是关于什么的?

谢谢!

解决方案:

下面的两个答案都非常有帮助。该问题实际上与 ServerSocket 无关,而是与应用程序的完全不同线程中的无眠 while 循环有关,但也取决于客户端是否已连接。

我能够使用 JDK 命令“jstack”识别活动线程,然后很容易找到带有失控循环的线程。

谢谢您的帮助!:)

4

2 回答 2

2

也许最简单的方法来解决正在发生的事情是等待它以 100% 运行,并通过Ctrl-Break(或使用SendSignal或类似方法)生成一个线程转储。您将获得一组线程及其状态,并且应该很清楚哪个线程正在运行,以及它在代码中的位置。

于 2010-02-28T12:42:30.743 回答
1

一旦客户端断开连接,负载就会恢复到 100%。

这通常是“ while loop”中没有 sleep() 的情况。
请参阅此线程以获取说明。

例子:

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 回答