IPv6网络接口的程序检查中的Java堆外内存泄漏

时间:2014-06-09 17:11:06

标签: java memory-leaks ipv6

我有一个网络客户端,根据客户端计算机在非环回接口上是否具有IPv6,重复执行稍有不同的操作:

public void doTheThing() throws SocketException {
    while (true) {
        if (hasIPv6Address(NetworkInterface.getNetworkInterfaces())) {
            doTheIPv6Thing();
        } else {
            doTheIPv4Thing();
        }
    }
}

private static boolean hasIPv6Address(Enumeration<NetworkInterface> intfs) throws SocketException {
    while (intfs.hasMoreElements()) {
        NetworkInterface intf = intfs.nextElement();
        if (intf.isLoopback()) continue;
        Enumeration<InetAddress> addresses = intf.getInetAddresses();
        while (addresses.hasMoreElements()) {
            if (addresses.nextElement() instanceof Inet6Address) return true;
        }
        if (hasIPv6Address(intf.getSubInterfaces())) return true;
    }
    return false;
}

这个程序有一个奇怪的堆外内存泄漏:Java堆是稳定的,并且线程数是稳定的,但是内存使用量仍然增长并且增长直到程序被oom-killer杀死。为什么呢?

1 个答案:

答案 0 :(得分:3)

这是known bug in Java NetworkInterface.isLoopback()。它在Java 7(u60)和Java 8(b105)中修复,不会在Java 6中修复。

可能我的客户并不需要检查IPv6接口是否突然出现或消失,并且可以在开始时检查一次而不是每次迭代。