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

时间:2015-04-22 20:17:14

标签: java linux multithreading

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

在向执行程序提交任务(使用newFixedThreadPool创建)后,我监视'top'命令的输出,并注意到cpu在内核空间中花费了大量时间('top'输出中的“%sy”) - 15%到25%之间 - 在执行这些任务期间(在它之前和之后再次减少)。 在某些测试运行中,确实会发生“%sy”保持接近0,然后执行速度更快。

线程数等于测试计算机上的逻辑cpus数,这也是我提交给执行程序的任务数(因此它就像1个线程 - 1个CPU绑定任务)。因此,我不希望在这里进行大量的上下文切换。

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

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

为什么会发生这种情况的任何想法?我该怎么调试这个问题?

1 个答案:

答案 0 :(得分:0)

您可能需要使用Profiler