Сколько потоков может поддерживать Java VM в Linux? - PullRequest
1 голос
/ 09 ноября 2010

Я написал класс пула потоков со ссылкой http://www.informit.com/articles/article.aspx?p=30483&seqNum=5

Среда: Windows7 4 cp

Запустил мою программу с 70000 Thread в Windows 7, под JDK 1.5 она прошла успешно. Не используются аргументы vm.

Тот же код, который я пытался выполнить с 5,000 Thread в Linux Enterprise Edition, которая находится под Virtual Box с 4 ГБ базовой памяти. с аргументами vm -xms512m -xmx1024m. Выполняет до 2156 потоков и выдает исключение

Исключение в потоке "main" java.lang.OutOfMemoryError: невозможно создать новый собственный поток на java.lang.Thread.start0 (собственный метод) на java.lang.Thread.start (Thread.java:597) в testthreadpool.ThreadPool. (ThreadPool.java:38) at testthreadpool.TestThreadPool.main (TestThreadPool.java:16)

Но тот же код отлично работает в Windows7.

Могу ли я знать, почему возникает эта ошибка. Требуется ли для этого Java-кода 1 ГБ памяти для запуска Just 5000 потоков? ...

Мое действительное требование - держать ThreadPool с 10 000 рабочих потоков.

Ответы [ 4 ]

4 голосов
/ 09 ноября 2010

Мое действительное требование - иметь ThreadPool с 10000 рабочих потоков.

Я думаю, вам нужно пересмотреть ваше требование.Это ни в коем случае не является хорошей идеей и катастрофически сказывается на производительности.

0 голосов
/ 09 ноября 2010

Вы на 64-битном?

Не ожидайте, что 32-битная машина сможет запускать много потоков. Вы также можете настроить размер стека. При запуске большого количества потоков используется много памяти для стеков, и вы не сможете обойти это, если не будете терпеть меньшие стеки.

При проверке x86_64, Linux, кажется, по умолчанию использует стеки 8M, что означает, что 1k потоков занимает стек 8G, так что вы действительно хотите быть осторожными с этим.

0 голосов
/ 09 ноября 2010

Потоки требуют стека, который должен иметь начальный размер.Для потоков начальный размер стека по умолчанию равен пределу размера стека, как показано ulimit -s, но может быть изменен путем вызова pthread_attr_setstacksize().(Смотрите этот другой ТАК вопрос ).

0 голосов
/ 09 ноября 2010

Как указывает @Yann, использование 10000 потоков - это действительно плохая идея ... если у вас нет машины с тысячами ядер. Вы должны серьезно взглянуть на дизайн вашего приложения.

В краткосрочной перспективе попробуйте настроить размер стека потоков по умолчанию с помощью параметра -Xss... JVM. Также обратите внимание, что стеки не выделяются в куче памяти, поэтому ваша опция -Xms512m -Xmx1024m не резервирует место для стеков. Наоборот, это резервное пространство, которое не может затем использоваться для стеков.

Наконец, могут быть другими (кроме памяти для стеков потоков), которые ограничат число потоков, которые может создать ваше приложение.

...