JAVA 应用JVM 的 DNS 缓存机制
在 Java 应用中,DNS 缓存(DNS Caching)是由 JVM 内置实现的,主要体现在以下几个方面:
1. Java 的 DNS 缓存机制
- JVM 默认会缓存 DNS 查询结果。
- 缓存时间由 JVM 配置参数控制,默认情况下是“永久缓存”,即进程生命周期内只查一次 DNS,之后都用缓存。
- Java 既缓存正向解析(hostname -> IP),也缓存反向解析(IP -> hostname)。
2. 相关配置参数
配置方式
通过 JVM 系统属性、security 配置文件或者代码 API 设置。
常用参数
a. networkaddress.cache.ttl
- 控制正向 DNS 解析(hostname -> IP)的缓存时间(单位:秒)。
- 设为 0 表示不缓存,-1 表示永久缓存(默认)。
b. networkaddress.cache.negative.ttl
- 控制负向 DNS 解析(找不到主机名时的缓存时间)。
- 设为 0 表示不缓存,-1 表示永久缓存。
配置举例
在启动参数中设置(推荐):
-Dnetworkaddress.cache.ttl=60
-Dnetworkaddress.cache.negative.ttl=10
在 java.security 文件中设置:
networkaddress.cache.ttl=60
networkaddress.cache.negative.ttl=10
通过代码设置(不推荐,影响范围有限):
java.security.Security.setProperty("networkaddress.cache.ttl", "60");
java.security.Security.setProperty("networkaddress.cache.negative.ttl", "10");
3. 注意事项
- 配置只对当前 JVM 进程有效,不影响其他系统或进程。
- 某些应用服务器(如 Tomcat、Spring Boot)启动时可通过 JVM 参数注入。
- Java 的 DNS 缓存不一定会严格遵守 DNS 服务器返回的 TTL,而是使用上述配置参数。
- 如果 DNS 记录变更,但 Java 应用 DNS 仍缓存旧 IP,常见原因就是 networkaddress.cache.ttl设为默认永久。
4. 实际建议
- 推荐显式设置合理的 TTL(如 60 秒),避免 DNS 记录变更后连接异常。
- 对于高可用、动态服务注册发现场景,不要用永久缓存。
- 可通过 -Dnetworkaddress.cache.ttl=60 -Dnetworkaddress.cache.negative.ttl=10方式启动。
5. 检查及排查
- JVM 启动日志不会打印 DNS 缓存参数,需自行确认参数。
- 可以通过代码或配置文件确认是否已正确设定。
- 若发现 DNS 解析异常或 IP 变更不生效,优先检查该参数设置。
参考文档
总结:
Java 应用的 DNS 缓存由 JVM 控制,默认永久缓存,可通过 networkaddress.cache.ttl 参数调整,实际缓存行为与 DNS 响应的 TTL 无关,需根据业务需求合理配置。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号