当ServerSocket空闲时,Linux上的Tomcat6使用100%的CPU

时间:2010-02-28 12:30:11

标签: java load cpu tomcat6 serversocket

问候

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

ServerSocket serverSocket = new ServerSocket(6767);

Socket xmlSocket = serverSocket.accept();        

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

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

有人可以告诉我这是关于什么的吗?

谢谢!

SOLUTION:

以下答案都非常有用。问题实际上与ServerSocket没有关系,但在应用程序的完全不同的线程中有一个不眠时的while循环,但也取决于客户端是否已连接。

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

感谢您的帮助! :)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

  

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

这通常是“while loop”中没有sleep()的情况 有关插图,请参阅this thread

示例:

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有一条通过它的路径没有睡眠,特别是当你的尝试失败时   你需要在某个地方睡觉,所以其他线程/进程有机会。或者不继续尝试已经失败的客户端。