Сколько потоков может поддерживать виртуальная машина Java в Linux?

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

Окружающая среда: Windows7 4 cp

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

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

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

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

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

Мое фактическое требование состоит в том, чтобы удерживать ThreadPool с 10 000 Workthread.


person user500796    schedule 09.11.2010    source источник


Ответы (4)


Мое фактическое требование состоит в том, чтобы удерживать ThreadPool с 10 000 Workthread.

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

person Yann Ramin    schedule 09.11.2010
comment
Ограничение заключается в том, чтобы не использовать пакет параллелизма. Необходимо использовать только палин Java Thread. - person user500796; 09.11.2010
comment
Может плохая идея. Но нет ограничений на создание количества потоков и сохранение его в рабочем режиме, когда я даю достаточно памяти. Он терпит неудачу около 2156 года. - person user500796; 09.11.2010
comment
Любопытно, а почему нельзя использовать java.util.concurrent? - person Jeremy; 09.11.2010
comment
@ user500796: Проблема не в использовании простых потоков, а в том, что вы используете 10 000 из них. Темы не бесплатны, даже если никогда не использовались. Нет никакой пользы от использования более чем нескольких потоков по соображениям производительности, и производительность будет ужасной, если вы постоянно переключаете контекст 10 000 потоков. Рассмотрите возможность использования неблокирующего ввода-вывода, сопрограмм или других механизмов, если вы пытаетесь масштабироваться. - person Yann Ramin; 09.11.2010
comment
Поскольку мы имеем дело с приложением с малой задержкой, мы ожидаем около 7020 запросов в секунду в худшем случае. Все эти запросы должны быть обработаны и отправлены как можно скорее. Задержка не принимается. - person user500796; 09.11.2010

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

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

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

person Stephen C    schedule 09.11.2010
comment
Ребята, это было действительно полезно. Я сделал настройку и смог создать 6000 для целей тестирования. Как и советовали, мы подумали об уменьшении количества потоков. - person user500796; 23.11.2010

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

person ninjalj    schedule 09.11.2010

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

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

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

person MarkR    schedule 09.11.2010