我有这个 Java 游戏服务器,最多可处理 3,000 个 tcp 连接,每个玩家或每个 tcp 连接都有自己的线程,每个线程的运行情况如下:
public void run()
{
try
{
String packet = "";
char charCur[] = new char[1];
while(_in.read(charCur, 0, 1)!=-1 && MainServer.isRunning)
{
if (charCur[0] != '\u0000' && charCur[0] != '\n' && charCur[0] != '\r')
{
packet += charCur[0];
}else if(!packet.isEmpty())
{
parsePlayerPacket(packet);
packet = "";
}
}
kickPlayer();
}catch(IOException e)
{
kickPlayer();
}catch(Exception e)
{
kickPlayer();
}
finally
{
try{
kickPlayer();
}catch(Exception e){};
MainServer.removeIP(ip);
}
}
代码运行良好,我知道每个玩家的每个线程都是一个坏主意,但我现在也必须保持这种方式。服务器在快速机器(6cor x2、64 位、24GB RAM、Windows Server 2003)上运行良好。
但在某个时刻,大约 12 小时的正常运行时间之后,服务器开始在某个地方循环...我知道这是因为 java 进程无限地占用 99% 的 CPU,直到下次重新启动。
我很难分析该应用程序,因为我不想打扰玩家。我使用的探查器(visualvm)总是最终破坏服务器而不告诉我问题出在哪里。
无论如何,在上面的那段代码中,我认为问题可能来自于此:
while(_in.read(charCur, 0, 1)!=-1)
(the _in
is a BufferedReader
客户端的套接字)。
有没有可能_in.read()
可以无限地返回其他东西,让我的代码保持运行并占用 99% 的资源吗?我的代码有问题吗?我没全部看懂,只写了一半。