java - 为什么在 Java 中我的 CPU 绑定(bind)线程会导致内核空间中的操作?

标签 java linux multithreading

我有一个大型 C 类型数组和一个线程池。每个线程都有一系列索引(它们不重叠),并执行一些 CPU 密集型操作来填充它们。

将任务提交给执行器(使用 newFixedThreadPool 创建)后,我监视“top”命令的输出,并且可以注意到,在执行这些任务期间,CPU 在内核空间中花费了大量时间(“top”输出中的“%sy”),介于 15% 和 25% 之间(在它变低之前和再次减少之后)。 在某些测试运行中,确实会发生“%sy”保持接近 0 的情况,然后执行速度会快得多。

线程数等于测试机器上的逻辑 cpu 数,这也是我提交给执行器的任务数(因此就像 1 个线程 - 1 个 CPU 绑定(bind)任务)。因此,我不期望这里有大量的上下文切换。

在这部分代码中,我没有执行显式同步,我仅依赖执行程序服务提供的保证,因为线程不共享任何变量。

操作系统为Amazon Linux AMI 2014.09,程序运行在Java 8上。

有什么想法为什么会发生这种情况吗?我如何调试此类问题?

最佳答案

您可能需要使用 Profiler

关于java - 为什么在 Java 中我的 CPU 绑定(bind)线程会导致内核空间中的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29807945/

相关文章:

java - 将 OWL 公理转换为曼彻斯特语法

java - 如何使用单个 java 类在多个 View 之间切换?

java - java赋值中可能存在逻辑错误的误解

linux - Linux 内核 2.6.27 中的 per-cpu 变量定义

c# - 处理器线程 C#

java - 如何在 Java 中使用枚举作为数组下标

python - 从终端停止 python 脚本

linux - 如何在终端 lisp 方案解释​​器中导航文本?

python - 队列和线程: subprocess goes missing

android - Android 中的 NetworkOnMainThreadException 错误