问候
我在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”识别活动线程,然后找到带有失控循环的线程很容易。
感谢您的帮助! :)
答案 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
有一条通过它的路径没有睡眠,特别是当你的尝试失败时 你需要在某个地方睡觉,所以其他线程/进程有机会。或者不继续尝试已经失败的客户端。