BufferedReader.read()占用100%的CPU

Rea*_*cen 9 java sockets multithreading profiling tcp

我有一个JAVA游戏服务器,每个TCP连接使用1个线程.(我知道这很糟糕,但我现在必须保持这种方式).在(3.2Ghz 6cor x2机器,24GB RAM,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器upTime大约12个小时或更长时间(连接大约3.000个播放器)后,服务器开始永久占用所有12个CPU中的100%,直到我手动重启JAVA应用程序.所以游戏开始落后于糟糕,我的球员开始抱怨.

我试过分析应用程序,这是我想出的:

我的分析结果的屏幕截图

所以我猜这个问题来自这里:

while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)
Run Code Online (Sandbox Code Playgroud)

知道变量"_in"是套接字输入的读者:(_in = new BufferedReader(new InputStreamReader(_socket.getInputStream()))).

为什么地球上_in.read()在长时间服务器upTime之后占用了这么多CPU?

我试过放一个Thread.sleep(1); 而且在While循环中更多,但没有做任何事情,我想问题是在BufferedReader.read()方法内部.

有谁知道这会导致什么?以及如何解决它?

Roe*_*yen 1

我不知道为什么调用很慢,但我永远不会在紧密循环中一次读取一个字节。谁知道内部函数有什么样的开销。

我将读取流中当前可用的所有数据并对其进行解析。这将需要一个缓冲区和一些额外的簿记,但无论如何比从流中逐字节读取要快。