2

机器是双核的,操作系统使用多处理器内核。为了运行一些性能评估,我想将 JVM 的线程亲和性设置为单核。但是,我担心我的性能测量会出现偏差,因为 JVM 可能不知道它现在被限制在单核上,但仍然使用多处理器原语进行线程同步和垃圾收集。虽然可以从命令行调整垃圾收集器,但这对于线程同步是不可能的。

现在,JVM 主要使用(*)操作系统线程作为其线程。所以也许问题应该是“操作系统(Windows / Linux)是否在通过设置相应进程的线程亲和性来限制使用单核的多线程应用程序中使用正确的同步原语?”

(*) 这在 Windows 上并不完全正确,JVM 在调用操作系统之前会自行旋转。该行为可以通过 -XX:+UseSpinning 和 -XX:PreBlockSpin 设置来控制。

4

1 回答 1

0

如果只设置 JVM 的亲和性,那么结果无论如何都会有一定程度的偏差。即使 JVM 100% 地运行在单核机器上,操作系统内核和其他用户空间代码仍然会使用额外的内核。这意味着更少的上下文切换开销,因此具有不同的性能特征。

我只会禁用第二个核心。假设您使用的是 Windows XP:c:\boot.ini通过添加进行编辑

/onecpu

启动选项列表并重新启动机器。

于 2009-07-30T12:44:39.657 回答