2016-09-01 3 views
1

У меня несколько рецидивирующий проблемы с приложением, использующим 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 заполняется до более чем 75%, и полная коллекция gargbage активируется.

Проблема в том, что после FullGC не выпущена ни одна из памяти, поэтому FullGC снова запускается. Это повторяется непрерывно, и поэтому CPU занят только выполнением GC, и почти никакой цикл CPU не передается ни на один другой поток, эффективно висящий на всех других потоках Tomcat.

Это происходит в промежутке не более 5 или 10 минут.

Это не похоже на загрузку системы, потому что это происходит также, когда у меня нет более двух потоков, активных и работающих.

Даже попытка получить кучу кучи или стакада затруднена из-за невосприимчивости к процессу 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 экземпляров (это те которые holded первыми из них). Это составляет почти 2,5 ГБ, а куча памяти - 3 ГБ.

У меня есть свалка jstack thread в один момент, когда возникла эта проблема, что я не могу писать здесь, чтобы ограничить характер. Если кто-то хочет посмотреть на него, спросите, и я поделюсь им.

Единственное решение, которое у меня есть сейчас, - это уничтожение процессов 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 ([email protected]) (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, но я не думаю, что любой из них является виновником.

+0

При возникновении проблемы укажите дамп вашего приложения. – benbenw

+0

@benbenw, спасибо за ваш ответ! IHere - это ссылка на [файл] (https://drive.google.com/file/d/0B_dQKrkjWdg_MU51MjBESG9fVlE/view?usp=sharing) – medicenfranito

ответ

1

Большинство ваших HTTP-потоков блокируются в log4j.

Вы, вероятно, уровень log4j слишком низкий (например, трассировку)

Это приводит к:

  • раздор
  • распределения памяти
  • плохой производительности

Из-за конкуренции , память сохраняется дольше.

Попробуйте установить уровень log4j в WARN.

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

+0

за ваш ответ! Я тоже это заметил, но я не могу знать, происходит ли блок и конфликт через log4j после или раньше, потому что из-за того, что GC занимает большую часть CP Utime, ни один поток не может превзойти их код, поэтому я думаю, что это ожидаемо что вещи блокируются, поскольку потоки, удерживающие блокировки, не могут продвигаться и освобождать их Другое дело, что это происходит очень быстро, а затем с тем же (или большим) количеством загрузки HTTP (и, thereferoe, MORE logging) это снова не появляется. Я определенно собираюсь настроить производительность log4j, но я сомневаюсь, что это настоящая причина ... – medicenfranito