У меня есть игровой сервер JAVA, который использует 1 поток на каждое соединение TCP.(Я знаю, что это плохо, но мне придется сейчас так держать).На компьютере (3,2 ГГц 6cor x2, 24 ГБ ОЗУ, Windows Server 2003 64бит) и вот фрагмент кода:
public void run()
{
try
{
String packet = "";
char charCur[] = new char[1];
while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)
{
if (charCur[0] != '\u0000' && charCur[0] != '\n' && charCur[0] != '\r')
{
packet += charCur[0];
}else if(!packet.isEmpty())
{
parsePlayerPacket(packet);
packet = "";
}
}
}catch(Exception e)
{
e.printStackTrace();
}
finally
{
try{
kickPlayer();
}catch(Exception e){e.printStackTrace();};
Server.removeIp(_ip);
}
}
Примерно через 12 или более часов работы сервера upTime (и около 3000 подключенных игроков) сервер начинает пожирать 100% всех 12 процессоров навсегда, пока я не перезагружу приложение JAVA вручную.Так что игра начинает очень сильно отставать, и мои игроки начинают жаловаться.
Я попытался профилировать приложение, и вот что я придумал:
ИтакЯ предполагаю, что проблема возникает отсюда:
while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)
зная, что переменная "_in" является читателем ввода сокета: (_in = new BufferedReader (new InputStreamReader (_socket.getInputStream ()))).
С какой стати _in.read () так долго загружает ЦП после долгого времени работы сервера?
Я пытался поставить Thread.sleep (1);и многое другое внутри цикла while, но ничего не делает, я думаю, проблема в методе BufferedReader.read ().
Кто-нибудь имеет представление о том, что может вызвать это ??И как это исправить?