2010-11-09 2 views
1

я написал класс Thread пула со ссылкой http://www.informit.com/articles/article.aspx?p=30483&seqNum=5Сколько потоков может поддерживать Java VM в Linux?

среды: Windows7 4 ф

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

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

Исключение в потоке «основной» java.lang.OutOfMemoryError: не удалось создать новую родную нить на java.lang.Thread.start0 (Native Method) в 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.

ответ

4

My actual requirement is to hold a ThreadPool with 10,000 Workthread.

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

+0

Ограничение не должно использовать пакет параллелизма. Необходимо использовать только палинную Java-тему. – user500796

+0

Может быть, плохая идея.Но нет никаких ограничений на создание количества потоков и сохранение его в режиме runnable, когда я даю достаточно места для памяти. Его не удается около 2156. – user500796

+0

Любопытно, почему вы не можете использовать 'java.util.concurrent'? – Jeremy

0

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

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

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

+0

Ребята, что было действительно полезно. Я настроил и смог создать 6000 для целей тестирования. Как мы советуем, мы думали о сокращении количества потоков. – user500796

0

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

0

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

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

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

Смежные вопросы