我正在努力减少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;
}
}
答案 0 :(得分:0)
Receive()是一个阻塞操作,因此执行它的线程将被阻止。 JVisualVM说线程花了很多时间(这是正常的,因为在新连接到达之前不会做任何事情)。 您还可以检查线程监视器以查看线程被阻止的%时间(即在I / O操作中)。
聚苯乙烯。您可能希望创建工作线程以处理收到的数据包。否则,您的服务一次只能处理一个请求。