【问题标题】:Tomcat many NioBlockingSelector$BlockPoller instances filling memory upTomcat 许多 NioBlockingSelector$BlockPoller 实例填满内存
【发布时间】:2016-09-01 15:48:38
【问题描述】:

我在使用 Tomcat 7.0.42 over Java 7 (Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)) 的应用程序中遇到了一个反复出现的问题

问题在于,没有任何明显的原因,而且显然是随机的(我认为显然不是)Java 堆填满了 75% 以上,并且一个完整的垃圾收集被激活。

问题是,在FullGC之后,没有释放任何内存,所以,FullGC又重新开始了。这不断重复,因此,CPU 只忙于执行 GC,几乎没有 CPU 周期分配给任何其他线程,有效地挂起所有其他 Tomcat 线程。

这发生在不超过 5 或 10 分钟的跨度内。

这似乎与系统负载无关,因为当我没有超过 2 个活动和正在运行的线程时也会发生这种情况。

由于 Java 进程的不响应,即使尝试获取堆或堆栈转储也很困难。

无论如何,我确实有一次得到了一个堆直方图,不幸的是我现在没有完整的直方图(我的错,我删除了文件,没有通知)但我在聊天中保留了这些信息:

1:      48504970     1552159040  org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller$2
2:      48506821     1164163704  java.util.concurrent.ConcurrentLinkedQueue$Node

如您所见,org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller$2 的实例数量超过 48k,java.util.concurrent.ConcurrentLinkedQueue$Node 实例数量相同(这些实例由第一个实例持有)。这最多可容纳 2.5GB,而我的内存堆为 3GB。

我有一个 jstack 线程转储,其中一次出现了这个问题,我不能在这里发布,因为字符限制。如果有人想看,请询问,我会分享。

我现在唯一的解决方案是杀死 Tomcat java 进程并重新启动服务器。

这可能是什么原因?

即使发生的时间似乎也是随机的。它有时发生在早上,有时发生在晚上。一天在同一天发生了两次(中间Tomcat重新启动)。

我正在通过 Linux (Linux version 3.10.0-123.9.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Tue Oct 28 18:05:26 UTC 2014) 在 Java 7(内部版本 1.7.0_51-b13)上运行 Tomcat 7.0.42。

我也有 JBoss Infinispan Cache 和 Apollo MQ 消息服务的实例,但我认为这两者都不是罪魁祸首。

【问题讨论】:

  • 出现问题时请提供您的应用程序的线程转储。
  • @benbenw,感谢您的回复!我这里是file的链接

标签: java linux tomcat nio connector


【解决方案1】:

您的大部分 http 线程都在 log4j 中被阻塞。

您的 log4j 级别可能太低(例如跟踪)

这导致:

  • 争用
  • 内存分配
  • 表现不佳

由于争用,内存被持有的时间更长。

尝试将 log4j 级别设置为 WARN。

这可能无法解决您的所有问题,但会有所帮助。

【讨论】:

  • 感谢您的回复!我也注意到了,但我不知道块和通过 log4j 的争用是在之后还是之前发生,因为由于 GC 占用了大部分 CP Utime,没有线程可以执行他们的代码,所以,我认为事情是可以预料的由于持有锁的线程无法前进并释放它们而被锁定另一件事是这种情况发生得非常快,然后,在相同(或更多)量的 HTTP 负载(以及,引用,更多日志记录)下,这不会发生再次。我肯定会调整 log4j 性能,但我怀疑这是真正的原因......
猜你喜欢
  • 1970-01-01
  • 2016-10-18
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 2018-02-06
相关资源
最近更新 更多