请在下面找到出现问题的应用程序/环境详细信息。
我看到应用程序中的许多线程有时会进入阻塞状态几分钟。在线程转储分析中,发现 java.net.InetAddress.getLocalHost 调用花费了太多时间。很多线程都卡在这里。为应用程序中打印的每个记录器获取主机名。
该问题是间歇性的。但是当它发生时,应用程序/tomcat将进入暂停状态,从而导致大量线程的积累。一段时间(几秒钟)后,所有阻塞的线程同时解除阻塞。由于请求并发,应用程序将耗尽它在池中维护的数据库连接,从而导致问题/缓慢/服务可用性。作为修复,我确保仅将主机名访问一次到静态变量中,并在整个日志记录过程中使用相同的主机名。我想知道这个问题的详细根本原因。
以下来自线程转储的示例:
"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)