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.

Это может не исправить все ваши проблемы, но это поможет.

Другие вопросы по тегам