【发布时间】:2015-08-14 03:37:56
【问题描述】:
最初的问题:
我有一个使用 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 指出。
【问题讨论】:
-
详细介绍Windows系统和Linux系统:都在同一个PC硬件上?一些经过测试的硬件规格和测试结果会很好......
-
@eee 是的,它们都在相同的硬件上运行。我很快就会生成一些测试结果。
-
@Alfabravo 在 Windows 1.6.0_22 和 linux 1.6.0_24 上
-
Oracle (HotSpot) Java?没有 OpenJDK 或其他一些 JDK 版本?
-
@Alfabravo 是的,两者都在 Oracle(HotSpot) Java 上运行