小编Sha*_*ath的帖子

使用 java.net.InetAddress.getLocalHost 查找主机名时线程进入阻塞状态

请在下面找到出现问题的应用程序/环境详细信息。

  • Java Web 应用程序部署在 Tomcat 9.0.35 上,JRE 版本为 1.8.0_231-b11
  • 该应用程序在部署在 Open shift Kubernetes 分发平台上的 docker 容器中运行。

我看到应用程序中的许多线程有时会进入阻塞状态几分钟。在线程转储分析中,发现 java.net.InetAddress.getLocalHost 调用花费了太多时间。很多线程都卡在这里。为应用程序中打印的每个记录器获取主机名。

该问题是间歇性的。但是当它发生时,应用程序/tomcat将进入暂停状态,从而导致大量线程的积累。一段时间(几秒钟)后,所有阻塞的线程同时解除阻塞。由于请求并发,应用程序将耗尽它在池中维护的数据库连接,从而导致问题/缓慢/服务可用性。作为修复,我确保仅将主机名访问一次到静态变量中,并在整个日志记录过程中使用相同的主机名。我想知道这个问题的详细根本原因。

  • 为什么这个问题会间歇性地出现?
  • 这个kubernetes环境下DNS查找有问题吗?
  • 我们正在使用 IPV4 协议/地址
  • 有没有更好的方法/修复来处理这个问题?

以下来自线程转储的示例:

 "https-jsse-nio-8443-exec-13" #95 daemon prio=5 os_prio=0 tid=0x00007fccadbba800 nid=0xaf5 waiting for monitor entry 0x00007fcb912d1000
       java.lang.Thread.State: BLOCKED (on object monitor)
        at java.net.InetAddress.getLocalHost(InetAddress.java:1486)
        - waiting to lock <0x00000005e71878a0> (a java.lang.Object)
Run Code Online (Sandbox Code Playgroud)

java performance https inetaddress tomcat9

2
推荐指数
1
解决办法
2357
查看次数

标签 统计

https ×1

inetaddress ×1

java ×1

performance ×1

tomcat9 ×1