Как мне сообщить JVM Hotspot, использовать ли однопроцессорную или многопроцессорную синхронизацию потоков? - PullRequest
2 голосов
/ 29 июля 2009

Машина двухъядерная, в ОС используется многопроцессорное ядро. Чтобы выполнить некоторые оценки производительности, я хочу установить привязку потоков JVM к одному ядру. Однако меня беспокоит, что я получу искаженные измерения производительности, поскольку JVM может не знать, что теперь он ограничен одним ядром, но все еще использует многопроцессорные примитивы для синхронизации потоков и сбора мусора. Хотя сборщик мусора можно настроить из командной строки, это невозможно для синхронизации потоков.

Теперь JVM использует в основном (*) OS-потоки для своих потоков. Поэтому, возможно, вопрос должен звучать так: «Используют ли ОС (Windows / Linux) правильные примитивы синхронизации в многопоточных приложениях, которые ограничены использованием одного ядра, устанавливая привязку к потоку соответствующего процесса?»

(*) Это не совсем так в Windows, где JVM вращается сама перед вызовом ОС. Это поведение можно контролировать с помощью параметров -XX: + UseSpinning и -XX: PreBlockSpin.

1 Ответ

0 голосов
/ 30 июля 2009

Если вы установите только сродство JVM, то результаты все равно будут в некоторой степени искажены. Даже если JVM работает на 100% так, как будто он работает на одноядерном компьютере, ядро ​​ОС и другой код пользовательского пространства все равно будут использовать дополнительные ядра. Это означает меньшие издержки переключения контекста и, следовательно, другие характеристики производительности.

Я бы просто отключил второе ядро. Предполагая, что вы используете Windows XP: отредактируйте c:\boot.ini, добавив

/onecpu

к списку параметров загрузки и перезагрузите компьютер.

...