我正在运行以下程序,与 Java 7 运行时相比,我使用 Java 8 运行时要慢得多。
public class MulticastTest {
public static void main(String args[]) throws Exception {
long start = System.nanoTime();
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
MulticastSocket multicastSocket = new MulticastSocket(6665);
while (networkInterfaces.hasMoreElements()) {
NetworkInterface iface = networkInterfaces.nextElement();
try {
multicastSocket.setNetworkInterface(iface);
} catch (IOException e) {
}
}
long durationMillis = (System.nanoTime() - start) / 1000000;
System.out.println("Took " + durationMillis + " millis");
}
}
当我在 java 8 上运行它时,大约需要 3500 毫秒。在 Java 7 上大约需要 150 毫秒。
我正在使用以下 Java 版本:
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
和
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
我使用的是 Windows 7,Service Pack 1,具体信息:
OS Name: Microsoft Windows 7 Professional
OS Version: 6.1.7601 Service Pack 1 Build 7601
我的机器有 25 个不同的接口(很多虚拟接口),但每个接口的操作时间大致相同。
有些调用失败,但即使是成功的调用也很慢。一个有趣的事实是,Java 版本之间有关失败操作的错误消息是不同的:
爪哇 7:
java.net.SocketException: An invalid argument was supplied
at java.net.TwoStacksPlainDatagramSocketImpl.socketNativeSetOption(Native Method)
at java.net.TwoStacksPlainDatagramSocketImpl.socketSetOption(TwoStacksPlainDatagramSocketImpl.java:145)
at java.net.AbstractPlainDatagramSocketImpl.setOption(AbstractPlainDatagramSocketImpl.java:309)
at java.net.MulticastSocket.setNetworkInterface(MulticastSocket.java:550)
爪哇 8:
java.net.SocketException: bad argument for IP_MULTICAST_IF2: No IP addresses bound to interface
at java.net.TwoStacksPlainDatagramSocketImpl.socketNativeSetOption(Native Method)
at java.net.TwoStacksPlainDatagramSocketImpl.socketSetOption(Unknown Source)
at java.net.AbstractPlainDatagramSocketImpl.setOption(Unknown Source)
at java.net.MulticastSocket.setNetworkInterface(Unknown Source)
运行jstack
我看到在以下线程堆栈中花费的时间最多:
main" #1 prio=5 os_prio=0 tid=0x0000000002248000 nid=0x1554 runnable [0x00000000026da000]
java.lang.Thread.State: RUNNABLE
at java.net.TwoStacksPlainDatagramSocketImpl.socketNativeSetOption(Native Method)
at java.net.TwoStacksPlainDatagramSocketImpl.socketSetOption(TwoStacksPlainDatagramSocketImpl.java:146)
at java.net.AbstractPlainDatagramSocketImpl.setOption(AbstractPlainDatagramSocketImpl.java:310)
at java.net.MulticastSocket.setNetworkInterface(MulticastSocket.java:554)
我已经尝试禁用所有 Windows 防火墙,但这没有任何区别。
该程序本身可能没有多大意义,但我正在尝试解决运行此类代码的第三方平台的问题,为什么重写它不是一种选择。
该问题可以在我们办公室的其他工作站上重现。
有什么想法可能导致这种行为或我如何进一步排除故障?