Tomcat: множество экземпляров NioBlockingSelector$BlockPoller, заполняющих память
У меня несколько повторяющаяся проблема с приложением, использующим Tomcat 7.0.42 поверх 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 Heap заполняется более чем на 75%, и активируется полная сборка мусора.
Проблема в том, что после FullGC не освобождается память, поэтому FullGC запускается заново. Это повторяется непрерывно, и поэтому ЦП занят только выполнением ГХ, и практически никакой цикл ЦП не передается ни одному другому потоку, фактически вешая все остальные потоки Tomcat.
Это происходит в течение не более 5 или 10 минут.
Похоже, это не связано с загрузкой системы, потому что это происходит также, когда у меня не более 2 активных и работающих потоков.
Даже попытка получить дамп кучи или стека затруднена из-за невосприимчивости процесса Java.
Во всяком случае, я однажды получил гистограмму кучи, и, к сожалению, сейчас у меня нет полной гистограммы (плохо, я удалил файл без уведомления), но я сохранил эту информацию в чате:
1: 48504970 1552159040 org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller$2
2: 48506821 1164163704 java.util.concurrent.ConcurrentLinkedQueue$Node
Как видите, существует более 48 тыс. Экземпляров org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller$2
и такое же количество java.util.concurrent.ConcurrentLinkedQueue$Node
экземпляры (это первые). Это вмещает почти 2,5 ГБ, и моя куча памяти составляет 3 ГБ.
У меня есть дамп потока jstack один раз, когда возникла эта проблема, которую я не могу опубликовать здесь из-за ограничений символов. Если кто-то захочет посмотреть на это, пожалуйста, спросите, и я поделюсь этим.
Единственное решение, которое у меня есть сейчас, - это уничтожение Java-процессов Tomcat и повторный запуск сервера.
Что может быть причиной этого?
Даже время появления кажется случайным. Встречается иногда утром, иногда вечером. Однажды это произошло два раза в один и тот же день (с перезапуском Tomcat в середине).
Я запускаю Tomcat 7.0.42 на Java 7 (сборка 1.7.0_51-b13) через 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
).
У меня также есть экземпляры JBoss Infinispan Cache и службы сообщений Apollo MQ, но я не думаю, что любой из них является виновником.
1 ответ
Большинство ваших http-тем заблокированы в log4j.
Возможно, у вас слишком низкий уровень log4j (например, трассировка)
Это ведет к:
- раздор
- распределение памяти
- плохая производительность
Из-за разногласий память держится дольше.
Попробуйте установить уровень log4j на WARN.
Это может не исправить все ваши проблемы, но это поможет.