1

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

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

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

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

системы на холостом ходу - 1% нагрузки. Я использую четырехъядерный процессор с 8 логическими ядрами. System at Idle

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

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

+1

Большинство систем показывают использование в процентах от одного процессора, полностью используемого. Таким образом, при полном использовании ваша программа будет составлять 400%. Не уверен, что это ваша проблема, но, возможно, вы просто неверно истолковываете. – Others

+2

Также используйте специальный инструмент java, например jmc, jconsole или jstat, чтобы посмотреть, что происходит. Может быть, куча java приближается к OutOfMemory, которая заставляет GarbageCollector записывать процессор. –

+0

Привет, Стив, вы получаете 95% -ное использование во всех ядрах процессора? –

ответ

-4

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

2

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

EDIT: на основе ваших изменений это, похоже, не так. Возможно, как @a_horse_with_no_name предлагает в комментариях, ваш код использует параллельный поток или другую автоматически распараллеливаемую операцию?

+0

№ Диспетчер задач Windows сообщает об использовании ЦП по всем ядрам. Благодаря 8 ядрам, одно полностью занятое ядро ​​приведет к использованию ЦП на уровне 12% в диспетчере задач. Второй скриншот также показывает, что все 8 ядер заняты, а не один. –

+0

@a_horse_with_no_name Я сделал свой ответ, прежде чем он добавил свое редактирование ... – Others