【发布时间】: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