我有一个大型 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/