java实现清理DNS Cache的方法
作者:shichen2014 发布时间:2022-07-27 23:11:50
标签:java,方法
本文实例讲述了java实现清理DNS Cache的方法。分享给大家供大家参考。具体分析如下:
一、测试环境
OS:Windows7 x64
JDK:1.6.0_45
二、本人找到四种方式清理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方法
三、代码
package xiaofei;
import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
/**
* @author xiaofei.wxf
* @date 13-12-18
*/
public class 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 args
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, NoSuchFieldException, IllegalAccessException {
java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
System.out.println(addr1.getHostAddress());
//clearCache();
//在下一行设置断点.
//放在此处无效,因为类加载的时候就确定了这个值(应该在使用InetAddress.getByName之前设置)已经缓存了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());
//clearCache();
}
public static void clearCache() throws NoSuchFieldException, IllegalAccessException {
//修改缓存数据开始
Class clazz = java.net.InetAddress.class;
final Field cacheField = clazz.getDeclaredField("addressCache");
cacheField.setAccessible(true);
final Object obj = cacheField.get(clazz);
Class cacheClazz = obj.getClass();
final Field cachePolicyField = cacheClazz.getDeclaredField("type");
final Field cacheMapField = cacheClazz.getDeclaredField("cache");
cachePolicyField.setAccessible(true);
cacheMapField.setAccessible(true);
final Map cacheMap = (Map)cacheMapField.get(obj);
System.out.println(cacheMap);
cacheMap.remove("www.baidu.com");
}
}
希望本文所述对大家的Java程序设计有所帮助。


猜你喜欢
- Spring是什么?我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃
- 本文实例为大家分享了android计算器实现加减乘除的具体代码,供大家参考,具体内容如 * :以下计算器只注重实现功能,不考虑其他BUG,只有
- 最近接了个项目其中有需要要实现此功能:seekbar需要显示最左和最右值,进度要跟随进度块移动。下面通过此图给大家展示下效果,可能比文字描述
- 背景最近公司的客户要求,分配给员工的任务除了有微信通知外,还希望PC端的网页也能实时收到通知。管理员分配任务是在我们的系统A,而员工接受任务
- 目录I. 项目环境1. 项目依赖II. 缓存注解介绍1. @Cacheable2. @CachePut3. @CacheEvict4. @C
- 在定义API的时候,对于一些返回集合对象的方法,很多人喜欢将返回类型定义成IEnumerable<T>,这本没有什么问题。这里要
- 如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;如果要保证线程安全,自然是Str
- 又遇到了回调函数,这次打算写下来分享一下。所谓回调函数,或者在面向对象语言里叫回调方法,简单点讲,就是回头在某个时间(事件发生)被调用的函数
- docker简介Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱。随着基
- 本文实例为大家分享了C#实现餐厅管理系统的具体代码,供大家参考,具体内容如下部分代码:fm_change_password.csusing
- 前言MyBatis提供了9种动态SQL标签:trim、where、set、foreach、if、choose、when、otherwise、
- 快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一
- 1. 前言今天开始我们来一步步窥探它是如何工作的。我们又该如何驾驭它。本篇将通过 Spring Boot 2.x 来讲解 Spring Se
- 本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据比如json数据如下:{responseHeader:{status:0
- 前言 因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果。本来没
- <%@ page language="java" contentType="text/html; cha
- 本文实例为大家分享了java斗地主发牌的具体代码,供大家参考,具体内容如下分析这是一个模仿斗地主发牌的例子;按照斗地主的规则,完成洗牌发牌的
- 本文实例为大家分享了C语言实现哈夫曼编码的具体代码,供大家参考,具体内容如下代码来自于《小甲鱼C++快速入门》主程序main.cpp#inc
- 在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,
- 这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋