이 기사의 예에서는 Java에서 DNS 캐시를 정리하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
1. 테스트 환경
운영체제: Windows7 x64
JDK: 1.6.0_45
2. jvm의 DNS 캐시를 지우는 네 가지 방법을 찾았습니다. 각자의 상황에 따라 선택하시면 됩니다.
1. 처음으로 InetAddress.getByName()을 호출하기 전에 java.security.Security.setProperty("networkaddress.cache.ttl", "0");을 설정하십시오.
2. jre/lib/security/java.security에서 networkaddress.cache.ttl 속성을 수정합니다.
3. jvm 시작 매개변수에서 -Dsun.net.inetaddr.ttl=0을 설정합니다.
4. 이 글의 clearCache 메소드와 같은 리플렉션을 통한 정리
3. 코드
다음과 같이 코드를 복사합니다. package xiaofei;
import java.lang.reflect.Field;
java.net.InetAddress 가져오기;
import java.net.UnknownHostException;
java.util.Map 가져오기;
/**
* @author xiaofei.wxf
* @date 13-12-18
*/
공개 클래스 DNSCacheTest {
/**
* 1. InetAddress.getByName()을 처음 호출하기 전에 java.security.Security.setProperty("networkaddress.cache.ttl", "0");을 설정하십시오.
* 2. jre/lib/security/java.security에서 networkaddress.cache.ttl 속성을 수정합니다.
* 3. jvm 시작 매개변수에서 -Dsun.net.inetaddr.ttl=0을 설정합니다.
* 4. ClearCache 메소드를 호출하여 삭제
*
* @param 인수
* @throws UnknownHostException
*/
public static void main(String[] args)은 UnknownHostException, NoSuchFieldException, IllegalAccessException을 발생시킵니다.
java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
System.out.println(addr1.getHostAddress());
//클리어캐시();
//다음 줄에 중단점을 설정합니다.
//이 값은 클래스가 로드될 때 결정되고(InetAddress.getByName을 사용하기 전에 설정되어야 함) 캐시되었기 때문에 여기에 넣는 것은 유효하지 않습니다.
//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());
//클리어캐시();
}
public static voidclearCache()는 NoSuchFieldException, IllegalAccessException을 발생시킵니다.
//캐시 데이터 수정 시작
Classclazz = java.net.InetAddress.class;
최종 필드 캐시Field = clazz.getDeclaredField("addressCache");
캐시Field.setAccessible(true);
최종 객체 obj = 캐시Field.get(clazz);
클래스 캐시Clazz = obj.getClass();
최종 필드 캐시PolicyField = 캐시Clazz.getDeclaredField("type");
최종 필드 캐시MapField = 캐시Clazz.getDeclaredField("cache");
캐시정책Field.setAccessible(true);
캐시MapField.setAccessible(true);
최종 맵 캐시맵 = (Map)cacheMapField.get(obj);
System.out.println(cacheMap);
캐시맵.remove("www.baidu.com");
}
}
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.