Низкое ограничение потока одного процесса Java в Red Hat Linux

У меня возникла проблема на тестовом компьютере под управлением Red Hat Linux (версия ядра 2.4.21-37.ELsmp) с использованием Java 1.6 (1.6.0_02 или 1.6.0_04). Проблема заключается в том, что как только определенное количество потоков создается в одной группе потоков, операционная система не желает или больше не может создавать.

Похоже, это характерно для создания потоков в Java, так как программа с ограничением потока на C смогла создать около 1,5 тыс. Потоков. Кроме того, этого не происходит с Java 1.4 JVM ... он может создавать более 1,4 тыс. Потоков, хотя они явно обрабатываются по-разному в зависимости от ОС.

В этом случае число обрезаемых нитей составляет всего 29 нитей. Это можно проверить с помощью простой Java-программы, которая просто создает потоки, пока не получит ошибку, а затем напечатает количество созданных потоков. Ошибка

java.lang.OutOfMemoryError: unable to create new native thread

На это, похоже, не влияют такие вещи, как количество потоков, используемых другими процессами или пользователями, или общий объем памяти, используемый системой в данный момент. Настройки JVM, такие как Xms, Xmx и Xss, похоже, тоже ничего не меняют (что ожидается, учитывая, что проблема, по-видимому, связана с созданием собственных потоков ОС).

Вывод «ulimit -a» как следует:

core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) 4
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 10240
cpu time             (seconds, -t) unlimited
max user processes            (-u) 7168
virtual memory        (kbytes, -v) unlimited

Предел пользовательского процесса, кажется, не является проблемой. Поиск информации о том, что может быть не так, не очень много, ноэта почта Кажется, это указывает на то, что по крайней мере некоторые ядра Red Hat ограничивают процесс до 300 МБ памяти, выделяемой для стека, и при 10 МБ на поток для стека кажется, что проблема может быть (хотя это кажется странным и маловероятным).

Я пытался изменить размер стека с помощью "ulimit -s" чтобы проверить это, но любое значение, кроме 10240 и JVM, не запускается с ошибкой:

Error occurred during initialization of VM
Cannot create VM thread. Out of system resources.

Обычно я могу обойти Linux, но я действительно мало знаю о конфигурации системы, и я не смог найти ничего, что конкретно касалось бы такой ситуации. Будем благодарны за любые идеи о том, какие настройки системы или JVM могут быть причиной этого.

Edits: Запуск программы ограничения потока, упомянутойплинтус, не было сбоев, пока он не попытался создать 1529-й поток.

Эта проблема также не возникала при использовании 1.4 JVM (действительно, с 1.6.0_02 и 1.6.0_04 JVM, на данный момент не могу протестировать с 1.5 JVM).

Код для теста потока, который я использую, выглядит следующим образом:

public class ThreadTest {

   public static void main(String[] pArgs) throws Exception {

      try {
         // keep spawning new threads forever
         while (true) {
            new TestThread().start();
         }
      }
      // when out of memory error is reached, print out the number of
      // successful threads spawned and exit
      catch ( OutOfMemoryError e ) {
         System.out.println(TestThread.CREATE_COUNT);
         System.exit(-1);
      }
   }

   static class TestThread extends Thread {
      private static int CREATE_COUNT = 0;
      public TestThread() {
         CREATE_COUNT++;
      }
      // make the thread wait for eternity after being spawned
      public void run() {
         try {
            sleep(Integer.MAX_VALUE);
         }
         // even if there is an interruption, dont do anything
         catch (InterruptedException e) {
         }
      }
   }
}

Если вы запустите это с 1.4 JVM, он зависнет, когда не сможет создать больше потоков и потребует kill -9 (по крайней мере, для меня).

More Edit:

Оказывается, что в системе, в которой возникла проблема, используется модель потоков LinuxThreads, в то время как другая система, которая работает нормально, использует модель NPTL.

Ответы на вопрос(5)

Ваш ответ на вопрос