Есть ли в Java автоматическое распараллеливание?

Я написал однопоточную программу с большим объемом вычислений, но когда я ее выполнил, я был удивлен, увидев, что мой четырехъядерный процессор загружен на 95%. Я ожидал увидеть что-то около 25% загрузки (одно ядро). Я использовал Process Explorer от sysinternals и был еще больше удивлен, увидев, что процесс Java имеет шесть потоков с почти идентичным распределением нагрузки, составляющим около 16% от общего времени процессора.

Изначально я планировал распараллелить свой код, но теперь кажется, что я не выиграю в производительности, так как процессор уже загружен на 95% даже с моим непараллельным кодом.

Кажется, что Java каким-то образом автоматически распараллеливает мой код, но все в сети говорит мне, что это не может быть правдой. Кто-нибудь знает, что происходит?

Изменить: я добавил несколько скриншотов, чтобы, надеюсь, ответить на некоторые вопросы ниже:

Система в простое — нагрузка 1 %. Я использую четырехъядерный процессор с 8 логическими ядрами. Система в режиме ожидания

Моя непараллельная программа Java запущена. Обратите внимание, что все 4 ядра почти исчерпаны: run

Просмотр моей непараллельной Java-программы из SysInternals Process Explorer. Обратите внимание на 8 потоков с почти одинаковой нагрузкой: procexp


person Steve K    schedule 29.12.2015    source источник
comment
Большинство систем показывают использование в процентах от полностью загруженного процессора. Таким образом, при полном использовании ваша программа будет на 400%. Не уверен, что это ваша проблема, но вполне возможно, что вы просто неправильно интерпретируете.   -  person Others    schedule 29.12.2015
comment
Также используйте специальный инструмент Java, такой как jmc, jconsole или jstat, чтобы увидеть, что происходит. Возможно, куча java приближается к OutOfMemory, что приводит к тому, что GarbageCollector сжигает процессор.   -  person Markus Kull    schedule 29.12.2015
comment
Привет, Стив, ты используешь все ядра процессора на 95%?   -  person Ravindra babu    schedule 29.12.2015
comment
Покажи нам свой код. Некоторые из новых потоков Java 8 могут выполнять автоматическую многопоточность.   -  person a_horse_with_no_name    schedule 29.12.2015


Ответы (2)


В большинстве систем, которые я использовал, проценты использования на самом деле представляют собой процент мощности одного ядра, который использует процесс. Если ваша система такая, вы просто неверно истолковываете процент использования. То есть Java использует 95% одного ЦП. Не уверен, что это то, что происходит, но это объясняет, как непараллельная программа может отображать 95%.

РЕДАКТИРОВАТЬ: Судя по вашим правкам, это не так. Возможно, как предполагает @a_horse_with_no_name в комментариях, ваш код использует параллельный поток или другую автоматически распараллеливаемую операцию?

person Others    schedule 29.12.2015
comment
Нет. Диспетчер задач Windows сообщает об использовании ЦП по всем ядрам. С 8 ядрами одно полностью занятое ядро ​​приведет к загрузке ЦП на 12% в диспетчере задач. И на втором скриншоте тоже видно, что заняты все 8 ядер, а не одно. - person a_horse_with_no_name; 29.12.2015

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

person William Rosenbloom    schedule 29.12.2015