机器是双核的,操作系统使用多处理器内核。为了运行一些性能评估,我想将 JVM 的线程亲和性设置为单核。但是,我担心我的性能测量会出现偏差,因为 JVM 可能不知道它现在被限制在单核上,但仍然使用多处理器原语进行线程同步和垃圾收集。虽然可以从命令行调整垃圾收集器,但这对于线程同步是不可能的。
现在,JVM 主要使用(*)操作系统线程作为其线程。所以也许问题应该是“操作系统(Windows / Linux)是否在通过设置相应进程的线程亲和性来限制使用单核的多线程应用程序中使用正确的同步原语?”
(*) 这在 Windows 上并不完全正确,JVM 在调用操作系统之前会自行旋转。该行为可以通过 -XX:+UseSpinning 和 -XX:PreBlockSpin 设置来控制。