Машина двухъядерная, в ОС используется многопроцессорное ядро. Чтобы выполнить некоторые оценки производительности, я хочу установить привязку потоков JVM к одному ядру. Однако меня беспокоит, что я получу искаженные измерения производительности, поскольку JVM может не знать, что теперь он ограничен одним ядром, но все еще использует многопроцессорные примитивы для синхронизации потоков и сбора мусора. Хотя сборщик мусора можно настроить из командной строки, это невозможно для синхронизации потоков.
Теперь JVM использует в основном (*) OS-потоки для своих потоков. Поэтому, возможно, вопрос должен звучать так: «Используют ли ОС (Windows / Linux) правильные примитивы синхронизации в многопоточных приложениях, которые ограничены использованием одного ядра, устанавливая привязку к потоку соответствующего процесса?»
(*) Это не совсем так в Windows, где JVM вращается сама перед вызовом ОС. Это поведение можно контролировать с помощью параметров -XX: + UseSpinning и -XX: PreBlockSpin.