My Life My Dream!

守信 求实 好学 力行
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2022-03-12 09:34  召冠  阅读(163)  评论(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