最初的问题:
我有一个使用 ExecutorService 来运行 4 个固定线程池的应用程序。当我使用这种架构时,应用程序在 Windows 上运行得更快,而不是单线程架构。但是当我在 linux 中运行 ExecutorService 架构时,我的应用程序的性能比单线程应用程序差。
两台机器上的 CPU 和其他硬件是相同的。我什至在不同的机器上尝试过,得到了相同的结果。我什至尝试将 fixedThreadPool 限制为 3 或 2,但性能仍然较慢。我缺少的变量可能是什么导致 linux 机器运行缓慢?
ExecutorService execSvc =
Executors.newFixedThreadPool(NUMBER_OF_PROCESSORS);
Perform perform[] = new Perform[n];
Future<?>[] future = new Future<?>[n];
for(int i=0;i<n;i++)
future = execSvc.submit(perform[i]);
for(int i=0;i<n;i++)
//To wait until all done
future[i].get();
两个操作系统都在同一台机器上运行。JAVA版本:windows 1.6.0_22, linux 打开JDK1.6.0_20
编辑:
我尝试在 linux 上添加 -Xincgc 并且似乎在最初的几分钟内代码运行速度如预期一样快,之后它开始加速并迅速变慢。请查看我创建的代码块在我的应用程序中运行了无数次,这是否表明 JVM GC 在不同操作系统中的行为不同?
试用后:
在尝试了 4 台不同的 linux 机器之后,看起来 openJDK 引起了问题。我不应该首先安装 openJDK,但感谢@Alfabravo 指出它。