【问题标题】:Java off-heap memory leak in program checking for IPv6 network interface程序检查 IPv6 网络接口中的 Java 堆外内存泄漏
【发布时间】:2014-06-09 17:11:06
【问题描述】:

我有一个网络客户端,它重复执行一个操作,这取决于客户端计算机是否在非环回接口上具有 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杀死。为什么?

【问题讨论】:

    标签: java memory-leaks ipv6


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2015-11-17
      • 2011-05-21
      相关资源
      最近更新 更多