multithreading - 如何告诉Hotspot JVM使用单处理器还是多处理器线程同步?

标签 multithreading synchronization jvm locking smp

机器是双核的,操作系统使用多处理器内核。为了运行一些性能评估,我想将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/

相关文章:

android - 自己的 Android 同步适配器?

java - 在 Java 中激活其他进程的窗口

JAVA - Class 类和 *.class 文件之间的区别?

.NET:向同一应用程序的所有实例发送文本消息并阅读

java - ParallelGC 和 ParallelOldGC 有什么区别?

java - 非同步i++是否重叠?

linux - Linux 进程/线程可以在不通过 do_exit() 的情况下终止吗?

multithreading - Julia线程中的变量是循环线程本地的吗?

java - 带Executor和不带Executor的多线程区别

synchronization - CUDA 线程围栏