Сотни системных потоков JBoss 5.1 ждут вечно

Около 3 месяцев назад мы перешли на JBoss 5.1.0.GA и через несколько дней после тестирования мы обнаружили несколько ошибок нехватки памяти (OOME) в журналах нашего приложения.

Затем я обнаружил проблему, которая описывала причину как ошибку в JVM до версии 7. Мы обновили до версии 7u25, и мы не увидели больше OOME, но теперь я вижу необычайно большое количество потоков: около 2 тысяч потоков и из них 1,9k - потоки демонов.

После проверки наших инструментов мониторинга я обнаружил, что все они являются потоками, сгенерированными пулом системных потоков JBoss (все они называются системными потоками JBoss(1)-XXXX). А вот детали трассировки стека:

"JBoss System Threads(1)-1649" Id=130217 in WAITING on lock=java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@a4d1d3
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

Я также проверил инструмент на наличие утечек и обнаружил следующие данные, которые, по моему мнению, в некоторой степени связаны:

Информация об утечке коллекции

Я проверил JBoss JIRA, но не нашел что-то связанное.

Может кто-нибудь указать мне, что происходит?

ОБНОВИТЬ:

Вот конфигурация пула потоков в jboss-service.xml

<!-- A Thread pool service -->
   <mbean code="org.jboss.util.threadpool.BasicThreadPool"
      name="jboss.system:service=ThreadPool">
      <attribute name="Name">JBoss System Threads</attribute>
      <attribute name="ThreadGroupName">System Threads</attribute>
      <!-- How long a thread will live without any tasks in MS -->
      <attribute name="KeepAliveTime">60000</attribute>
      <!-- The max number of threads in the pool -->
      <attribute name="MaximumPoolSize">3200</attribute>
      <!-- The max number of tasks before the queue is full -->
      <attribute name="MaximumQueueSize">3200</attribute>
      <!-- The behavior of the pool when a task is added and the queue is full.
      abort - a RuntimeException is thrown
      run - the calling thread executes the task
      wait - the calling thread blocks until the queue has room
      discard - the task is silently discarded without being run
      discardOldest - check to see if a task is about to complete and enque
         the new task if possible, else run the task in the calling thread
      -->
      <attribute name="BlockingMode">run</attribute>
   </mbean>

1 ответ

Решение

Пулы были созданы пулом, поскольку версия Java, на которой работал сервер, была несовместима. Мы перешли на более раннюю версию, и проблема исчезла.

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