4

次のプログラムを実行していますが、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、サービス パック 1 を使用しています。

OS Name:                   Microsoft Windows 7 Professional
OS Version:                6.1.7601 Service Pack 1 Build 7601

私のマシンには 25 の異なるインターフェイス (多数の仮想インターフェイス) がありますが、各インターフェイスの操作にはほぼ同じ時間がかかります。

一部の呼び出しは失敗しますが、成功した呼び出しでも速度は遅くなります。興味深い事実は、失敗した操作のエラー メッセージが Java のバージョン間で異なることです。

Java7:

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 ファイアウォールを無効にしようとしましたが、違いはありませんでした。

プログラム自体はあまり意味がないかもしれませんが、この種のコードを実行するサードパーティのプラットフォームの問題をトラブルシューティングしようとしています。

この問題は、オフィス内の他のワークステーションでも再現可能です。

この動作を引き起こす可能性のあるアイデア、またはさらにトラブルシューティングする方法はありますか?

4

1 に答える 1