我有大型的C类型和一个线程池。每个线程都有一系列索引(它们不重叠)并执行一些CPU绑定操作来填充它们。
在向执行程序提交任务(使用newFixedThreadPool创建)后,我监视'top'命令的输出,并注意到cpu在内核空间中花费了大量时间('top'输出中的“%sy”) - 15%到25%之间 - 在执行这些任务期间(在它之前和之后再次减少)。 在某些测试运行中,确实会发生“%sy”保持接近0,然后执行速度更快。
线程数等于测试计算机上的逻辑cpus数,这也是我提交给执行程序的任务数(因此它就像1个线程 - 1个CPU绑定任务)。因此,我不希望在这里进行大量的上下文切换。
在这部分代码中没有我完成的显式同步,我只依赖执行程序服务提供的保证,因为线程不共享任何变量。
操作系统是Amazon Linux AMI 2014.09,该程序在Java 8上运行。
为什么会发生这种情况的任何想法?我该怎么调试这个问题?