我在使用 Tomcat 7.0.42 over Java 7 (Java(TM) SE Runtime Environment (build 1.7.0_51-b13)) Java HotSpot(TM) 64 位服务器的应用程序时遇到了一个反复出现的问题虚拟机(build 24.51-b03,混合模式)
)
问题是,在没有任何可见原因的情况下,并且显然是随机的(我认为显然不是)Java 堆填充超过 75%,并且激活了一个完整的垃圾收集器。
问题是,FullGC之后,没有释放内存,所以,FullGC重新开始。这不断重复,因此 CPU 只忙于执行 GC,几乎没有 CPU 周期分配给任何其他线程,有效地挂起所有其他 Tomcat 线程。
这发生在不超过 5 或 10 分钟的时间内。
它似乎与系统负载无关,因为当我没有超过 2 个线程处于 Activity 状态和运行时也会发生这种情况。
由于 Java 进程没有响应,即使尝试获取堆或堆栈转储也很困难。
无论如何,我曾经得到过一次堆直方图,不幸的是我现在没有完整的直方图(我的错,我在没有通知的情况下删除了文件)但我从聊天中保留了这些信息:
1: 48504970 1552159040 org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller$2
2: 48506821 1164163704 java.util.concurrent.ConcurrentLinkedQueue$Node
如您所见,有超过 48k 个 org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller$2
实例和相同数量的 java.util.concurrent .ConcurrentLinkedQueue$Node
实例(这个由第一个持有)。这最多可容纳 2.5GB,而我的内存堆是 3GB。
我有一个出现此问题的时间的 jstack 线程转储,我不能在这里张贴字符限制。如果有人想看,请询问,我会分享。
我现在唯一的解决方案是终止 Tomcat java 进程并重新启动服务器。
这可能是什么原因?
甚至出现的时间似乎都是随机的。它有时在早上发生,有时在晚上发生。一天同一天发生两次(中间重启了Tomcat)。
我在 Java 7 (build 1.7.0_51-b13) 上运行 Tomcat 7.0.42 over Linux (Linux version 3.10.0-123.9.2.el7.x86_64 (builder@kbuilder.dev.centos.org ) (gcc 版本 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Tue Oct 28 18:05:26 UTC 2014
).
我还有 JBoss Infinispan Cache 和 Apollo MQ 消息服务的实例,但我认为这两者都不是罪魁祸首。
最佳答案
大多数 http 线程在 log4j 中被阻塞。
您的 log4j 级别可能太低(例如跟踪)
这导致:
- 争论
- 内存分配
- 表现不佳
由于争用,内存保持时间更长。
尝试将 log4j 级别设置为 WARN。
这可能无法解决您所有的问题,但会有所帮助。
关于java - Tomcat 许多 NioBlockingSelector$BlockPoller 实例填满了内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275936/