My Life My Dream!

守信 求实 好学 力行
随笔 - 193, 文章 - 0, 评论 - 55, 阅读 - 34万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

使用JDK获取本机信息方法的注意事项

Posted on   召冠  阅读(179)  评论(0编辑  收藏  举报

多负载环境,系统日志等场景为了方便明确具体应用增加了机器信息的记录,从网上搜到大量类似代码。但真正上生产环境后发现严重问题:随并发上升,该功能响应越来越慢,最后导致整个系统处于卡死状态。

分析发现,JDK内置的getLocalHost方法在信创等特定机器环境耗时较长,且该方法内有进程级的synchronized锁等待控制,导致生产环境随着并发请求增加,后续请求出现串行排队、响应时间放大的情况,甚至Tomcat容器http线程耗尽,所有web请求处于排队等待状态。

修改为缓存处理,设置启动后事件获取方式,避免影响业务用户的操作响应。

 

https://cloud.tencent.com/developer/article/1407559 

https://blog.csdn.net/nianbingsihan/article/details/80265029

复制代码
// 获取机器名

InetAddress.getLocalHost().getHostName()



// 获取机器IP

List<String> ips = new ArrayList<>();
Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
while (enumeration.hasMoreElements()) {
     NetworkInterface intf = enumeration.nextElement();
     if (intf.isLoopback() || intf.isVirtual()) {
         continue;
     }
     Enumeration<InetAddress> inets = intf.getInetAddresses();
     while (inets.hasMoreElements()) {
         InetAddress addr = inets.nextElement();
         if (addr.isLoopbackAddress() || !addr.isSiteLocalAddress() || addr.isAnyLocalAddress()) {
             continue;
         }
         ips.add(addr.getHostAddress());
     }
}
复制代码

 

image

image

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示