O exemplo neste artigo descreve o método de limpeza do cache DNS em Java. Compartilhe com todos para sua referência. A análise específica é a seguinte:
1. Ambiente de teste
SO: Windows7 x64
JDK: 1.6.0_45
2. Encontrei quatro maneiras de limpar o cache DNS do jvm. Você pode escolher de acordo com sua situação.
1. Antes de chamar InetAddress.getByName() pela primeira vez, defina java.security.Security.setProperty("networkaddress.cache.ttl", "0");
2. Modifique a propriedade networkaddress.cache.ttl em jre/lib/security/java.security
3. Defina -Dsun.net.inetaddr.ttl=0 nos parâmetros de inicialização jvm
4. Limpeza por reflexão, como o método clearCache neste artigo
3. Código
Copie o código da seguinte forma: pacote xiaofei;
importar java.lang.reflect.Field;
importar java.net.InetAddress;
importar java.net.UnknownHostException;
importar java.util.Map;
/**
* @autor xiaofei.wxf
* @data 13/12/18
*/
classe pública DNSCacheTest {
/**
* 1. Antes de chamar InetAddress.getByName() pela primeira vez, defina java.security.Security.setProperty("networkaddress.cache.ttl", "0");
* 2. Modifique a propriedade networkaddress.cache.ttl em jre/lib/security/java.security
* 3. Defina -Dsun.net.inetaddr.ttl=0 nos parâmetros de inicialização jvm
* 4. Chame o método clearCache para limpar
*
* @param argumentos
* @throwsUnknownHostException
*/
public static void main(String[] args) lança UnknownHostException, NoSuchFieldException, IllegalAccessException {
java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
System.out.println(addr1.getHostAddress());
//limparCache();
//Defina um ponto de interrupção na próxima linha.
//É inválido colocá-lo aqui, pois este valor é determinado quando a classe é carregada (deve ser definida antes de usar InetAddress.getByName) e foi armazenada em cache.
//java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr2 = InetAddress.getByName("www.baidu.com");
System.out.println(addr2.getHostAddress());
InetAddress addr3 = InetAddress.getByName("www.google.com");
System.out.println(addr3.getHostAddress());
InetAddress addr4 = InetAddress.getByName("www.google.com");
System.out.println(addr4.getHostAddress());
//limparCache();
}
public static void clearCache() lança NoSuchFieldException, IllegalAccessException {
//Começa a modificar os dados do cache
Classclazz = java.net.InetAddress.class;
campo final cacheField = clazz.getDeclaredField("addressCache");
cacheField.setAccessible(true);
objeto final obj = cacheField.get(clazz);
Classe cacheClazz = obj.getClass();
campo final cachePolicyField = cacheClazz.getDeclaredField("type");
campo final cacheMapField = cacheClazz.getDeclaredField("cache");
cachePolicyField.setAccessible(true);
cacheMapField.setAccessible(true);
mapa final cacheMap = (Mapa)cacheMapField.get(obj);
System.out.println(cacheMap);
cacheMap.remove("www.baidu.com");
}
}
Espero que este artigo seja útil para a programação Java de todos.