为什么MulticastSocket.setNetworkInterface()在使用Java 8运行时时时要慢得多?

为什么MulticastSocket.setNetworkInterface()在使用Java 8运行时时时要慢得多?,java,multicast,multicastsocket,Java,Multicast,Multicastsocket,我正在运行以下程序,与Java7运行时相比,使用Java8运行时的速度要慢得多 public class MulticastTest { public static void main(String args[]) throws Exception { long start = System.nanoTime(); Enumeration<NetworkInterface> networkInterfaces = NetworkInterfa

我正在运行以下程序,与Java7运行时相比,使用Java8运行时的速度要慢得多

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");
    }
}

我使用Windows 7,service pack 1,详细信息:

OS Name:                   Microsoft Windows 7 Professional
OS Version:                6.1.7601 Service Pack 1 Build 7601
我的机器有25个不同的接口(很多是虚拟接口),但是每个接口的操作时间差不多相同

有些呼叫失败,但即使是成功的呼叫也很慢。一个有趣的事实是,失败操作的错误消息在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 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)
Java 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防火墙,但没有任何区别

程序本身可能没有多大意义,但我正试图解决运行这种代码的第三方平台的问题,为什么不可以重写它

这个问题可以在我们办公室的其他工作站上重现


有什么想法会导致这种行为,或者我如何进一步排除故障吗?

这看起来像是ipv6的问题

如果我在本地运行你的程序,这需要1561毫秒才能运行

如果我使用
-Djava.net.preferIPv4Stack=true禁用ipv6堆栈,大约需要100个mills


值得注意的是,在启用ipv6的情况下,此程序在我的计算机上看到7个接口,但仅使用ipv4时仅看到4个接口。

您是否实际使用
catch(IOException e){}
运行此程序?也许是抛出并吞并了一个异常,这可以解释延迟的原因吗?@artbristol让我重新表述一下最后的评论。我已尝试捕获并检查异常。它实际上会在Java7和Java8上产生不同的异常。然而,在成功的调用上也可以看到这种缓慢,而不仅仅是在产生错误的调用上。有趣的是,尽管例外情况有所不同,但可能值得研究。我将在问题中添加细节。你如何测试?当你关闭你的程序时,你认为港口需要释放时间吗?我尝试在不同版本的运行之间更改端口-行为没有改变。
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)