机器是双核的,操作系统使用多处理器内核。为了运行一些性能评估,我想将JVM的线程亲和性设置为单个内核。但是,我担心我的性能测量结果会偏斜,因为JVM可能不知道它现在仅限于单个内核,但仍使用多处理器原语进行线程同步和垃圾收集。尽管可以从命令行调整垃圾回收器,但是对于线程同步来说这是不可能的。
现在,JVM使用大多数(*)OS线程作为其线程。因此,问题可能应该是“操作系统(Windows/Linux)是否在多线程应用程序中使用正确的同步原语,而这些原语通过设置相应进程的线程亲和性来限制使用单个内核?”
(*)在Windows上并非完全正确,在Windows上,JVM在调用OS之前自行旋转。可以通过-XX:+ UseSpinning和-XX:PreBlockSpin设置来控制该行为。
最佳答案
如果仅设置JVM的相似性,则结果无论如何都会偏斜。即使JVM就像在单核计算机上运行一样发挥100%的作用,OS内核和其他用户空间代码仍将使用其他内核。这意味着较少的上下文切换开销,因此具有不同的性能特征。
我只是禁用第二个核心。假设您使用的是Windows XP:通过添加来编辑c:\boot.ini
/onecpu
到boot options列表中,然后重新启动计算机。
关于multithreading - 如何告诉Hotspot JVM使用单处理器还是多处理器线程同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1200776/