gpt4 book ai didi

java - 采样器在 socket.receive(packet) 上提供高 CPU 负载

转载 作者:行者123 更新时间:2023-11-29 08:45:48 26 4
gpt4 key购买 nike

我正在尝试最小化 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;
}
}

最佳答案

Receive( ) 是一个阻塞操作,所以执行它的线程将被阻塞。JVisualVM 表示线程在那里花费了很多时间(这是正常的,因为在新连接到达之前什么都不会做)。您还可以检查线程监视器以​​查看线程被阻塞的时间百分比(即在 I/O 操作中)。

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

关于java - 采样器在 socket.receive(packet) 上提供高 CPU 负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25487781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com