У меня есть этот игровой сервер Java, который обрабатывает до 3000 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 бита, 24 ГБ ОЗУ, Windows Server 2003).
Но в какой-то момент, после 12 часов работы UpTime, сервер начинает зацикливаться где-то ...Знайте, потому что процесс Java занимает 99% ЦП бесконечно до следующей перезагрузки.И мне трудно профилировать приложение, потому что я не хочу беспокоить игроков.Профилировщик, который я использую (visualvm), всегда заканчивает кешью сервера, не сообщая мне, в чем проблема.
В любом случае, в этом фрагменте кода выше, я думаю, возможно, проблема в следующем:
while(_in.read(charCur, 0, 1)!=-1)
(_in
- это BufferedReader
клиентского сокета).
Возможно ли, что _in.read()
может бесконечно возвращать что-то еще, что будет поддерживать мой код в рабочем состоянии и брать 99% ресурсов?Что-то не так с моим кодом?Я не все понимаю, я написал только половину.