我有一个网络客户端,根据客户端计算机在非环回接口上是否具有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杀死。为什么呢?
答案 0 :(得分:3)
这是known bug in Java NetworkInterface.isLoopback()
。它在Java 7(u60)和Java 8(b105)中修复,不会在Java 6中修复。
可能我的客户并不需要检查IPv6接口是否突然出现或消失,并且可以在开始时检查一次而不是每次迭代。