JVM DNS 缓存配置(转)
原文:https://www.jianshu.com/p/048e8bd3ea46
作者:EricAlpha
域名解析并非一个简单的过程,其解析结果可能会被层层缓存,如浏览器 DNS 缓存、操作系统 DNS 缓存、ISP 的 DNS缓存,容易被忽略的是 JVM 本身也会对 DNS 进行缓存。
JVM 的 DNS 缓存可以通过以下参数进行配置:
- networkaddress.cache.ttl
- sun.net.inetaddr.ttl
- 如果开启了 SecurityManager,优先从 ${java.home}/jre/lib/security/java.security 中读取参数 networkaddress.cache.ttl,单位为秒。
- 如果未读取到,则会读取启动参数 sun.net.inetaddr.ttl 作为缓存 ttl.
- 如果以上参数均未读取到,并且未开启 SecurityManager,则会使用默认值 30s.
- 否则使用初始值 -1,表示永久生效。
以上逻辑可以在 InetAddressCachePolicy.class 中体现,反编译后,有如下代码
static { Integer var0 = (Integer)AccessController.doPrivileged(new PrivilegedAction<Integer>() { public Integer run() { String var1; // 优先读取 networkaddress.cache.ttl try { var1 = Security.getProperty("networkaddress.cache.ttl"); if (var1 != null) { return Integer.valueOf(var1); } } catch (NumberFormatException var3) { ; } // 未读取到,则读取启动参数 sun.net.inetaddr.ttl try { var1 = System.getProperty("sun.net.inetaddr.ttl"); if (var1 != null) { return Integer.decode(var1); } } catch (NumberFormatException var2) { ; } return null; } }); if (var0 != null) { cachePolicy = var0.intValue(); if (cachePolicy < 0) { cachePolicy = -1; } propertySet = true; } else if (System.getSecurityManager() == null) { // 如果未启用 SecurityManager,使用默认值 30 cachePolicy = 30; }
其中 cachePolicy 初始值为 -1,表示缓存永不失效。
除了解析成功的结果,JVM 也会缓存解析失败的结果,可以通过下列参数配置,对应代码中的negativeCachePolicy。看源码,如果没开启SecurityManager,也没配置sun.net.inetaddr.negative.ttl,那negativeCachePolicy=0,即不缓存
- networkaddress.cache.negative.ttl
- sun.net.inetaddr.negative.ttl
这里不展开介绍