java - 我有一个多线程 JAVA 应用程序在具有 N 个内核的 CPU 上运行(在 Linux 上)但是它只使用第 0 个内核而其余内核处于空闲状态

标签 java linux multithreading parallel-processing cpu-cores

如果我没记错的话,JVM 依赖于操作系统的底层架构来调度线程并将线程传播到其他内核(当生成线程时)。但是,在我的应用程序中,我没有看到它发生。每个线程都在第 0 个核心上运行,其余 N-1 个核心处于空闲状态。发生这种情况的任何具体原因,更重要的是,如何解决这个问题以便我可以利用我的其余核心?

我知道设置进程亲和性,但在某种程度上,这是将进程硬编码到特定核心。由于线程可以在任何给定点生成,因此它应该由闲置的核心进行闲置处理。

代码片段例如

public static void main() {

R1 r1 = new R1();
R2 r2 = new R2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1.start();
t2.start();
}

有什么建议吗?

最佳答案

几乎可以肯定,您的应用程序中存在某种原因导致 JVM 无法同时运行多个应用程序线程。

问题将出在 R1R2 类中,或者它们所依赖的某些东西中。由于您决定不向我们展示它们,我们只能猜测它可能是什么。然而,一个常见的解释是其中一个线程(运行您的代码)持有另一个线程试图获取的锁。这足以使您的应用程序有效地成为单线程。

建议:

  • 使用 jstack 实用程序获取应用程序的线程转储,并查看堆栈跟踪以了解线程正在做什么以及线程被阻塞的原因。

  • 使用调试器等运行应用程序。

  • 不要将时间浪费在调查调度程序、线程亲和性或类似的东西上。他们不太可能帮助您解决问题。

关于java - 我有一个多线程 JAVA 应用程序在具有 N 个内核的 CPU 上运行(在 Linux 上)但是它只使用第 0 个内核而其余内核处于空闲状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52161533/

相关文章:

java - 检查是否恰好存在节点的一个属性并在 XPAth 中返回该属性的值

linux - 与脚本比较并插入位 block

c - Linux 交叉编译库

multithreading - Node.js 是单线程的,这是否意味着我们不能在不同线程中运行多个 Node.js?

java - 为什么我在尝试使用局部变量时收到 "cannot find symbol"错误?

java - 使用 servlet 处理 GET 时,创建 Guice 注入(inject)的最佳位置是什么?

Python 线程名称未显示在 ps 或 htop 上

java - 在java中使用多线程添加整数2D数组元素比顺序添加慢

java - 除非发生其他事情,否则如何使用 if 语句运行?

linux -/lib/libc.so.0 buildroot 错误