采样器在socket.receive(数据包)上提供高CPU负载

时间:2014-08-25 14:06:27

标签: java udp

我正在努力减少Java程序的占用空间。 JVisualVM Sampler告诉我,即使没有数据进入,socket.receive()也需要大量的CPU时间。 套接字阻塞,未连接到任何其他计算机。 这只是采样器的问题还是JVM或我的代码的问题?

// constructor
if (this.isRunning && !this.socket.isClosed())
        return;
    this.socket = new DatagramSocket(port);
    this.isRunning = true;
    super.start();
...
// receive loop
while (this.isRunning && !thread.isInterrupted()) {
    try {
        byte[] buf = new byte[256];

        // receive request
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        this.socket.receive(packet);
        if (isRunning) {
            tokenize(packet, true);
        }
    } catch (SocketException se) {
        LOG.warn("Socket closed from outside");
    } catch (IOException e) {
        e.printStackTrace();
        this.isRunning = false;
    }
}

1 个答案:

答案 0 :(得分:0)

Receive()是一个阻塞操作,因此执行它的线程将被阻止。 JVisualVM说线程花了很多时间(这是正常的,因为在新连接到达之前不会做任何事情)。 您还可以检查线程监视器以​​查看线程被阻止的%时间(即在I / O操作中)。

聚苯乙烯。您可能希望创建工作线程以处理收到的数据包。否则,您的服务一次只能处理一个请求。