BufferedReader.read () Еда 100% CPU

У меня есть 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. Таким образом, игра начинает отставать, верны плохо, и мои игроки начинают жаловаться.

Я попробовал профилирование приложения, и вот то, что я придумал:

Screenshot of my profiling result

, поэтому я предполагаю, что проблема приходит отсюда:

while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)

Зная, что вариабельная «_in» является читателем ввода сокета : (_in = новый буферреджер (новый вход ввода (_socket.getinputtream ()))).

Почему на Земле _in.read () занимает столько процессоров после длительного времени безотказной работы?

Я пытался положить поток. И еще больше внутри цикла, но ничего не делают, я думаю, проблема находится внутри метода BufferedReader.read ().

У кого-нибудь есть идеи о том, что может вызвать это ?? И как это исправить?

9
задан Reacen 2 September 2011 в 09:12
поделиться