У меня есть Java Game Server, который использует 1 резьбу на TCP. (Я знаю, что это плохо, но мне придется держать его таким образом). На A (3,2 ГГц 6COR X2 Machine, RAM 24 ГБ, Windows Server 2003 64bits) и вот является частью кода:
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 часов или более 12 часов времени безотказной работы (и около 3.000 игроков, подключенных). % всех 12 процессоров навсегда, пока я не перезагрузим приложение Java. Таким образом, игра начинает отставать, верны плохо, и мои игроки начинают жаловаться.
Я попробовал профилирование приложения, и вот то, что я придумал:
, поэтому я предполагаю, что проблема приходит отсюда:
while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)
Зная, что вариабельная «_in» является читателем ввода сокета : (_in = новый буферреджер (новый вход ввода (_socket.getinputtream ()))).
Почему на Земле _in.read () занимает столько процессоров после длительного времени безотказной работы?
Я пытался положить поток. И еще больше внутри цикла, но ничего не делают, я думаю, проблема находится внутри метода BufferedReader.read ().
У кого-нибудь есть идеи о том, что может вызвать это ?? И как это исправить?