【问题标题】:Java: Executor Service runs slow on linux and not on WindowsJava:Executor Service 在 linux 上运行缓慢而不是在 Windows 上
【发布时间】: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 上运行

标签: java linux


【解决方案1】:

我能想到的唯一一件事是两个系统上的内存设置有所不同,并且您在 Linux 领域的早期内存不足。这里有一些尝试:

  • 在 Linux (duh) 下增加内存设置。 -Xmx1G 什么的
  • 收获后将每个未来分配给null。这可能影响不大,但可能值得帮助 GC。

    for(int i = 0; i < n; i++) {
       future[i].get();
       future[i] = null;
    }
    
  • 不要将Perform 对象存储在数组中。只需提交它们并忘记它们。如果您仍然需要它们,请将它们返回到 Future&lt;Perform&gt;,然后在完成后将它们设置为 null。
  • 最好的胜利可能是不要一次提交所有作业,而是保留 100 个未完成的作业或其他什么。将Future 数组转换为列表,并获得isDone()isCancelled() 的一次,并且仅当列表的大小低于某个阈值时才提交到池中。你需要睡觉才能不旋转。我最近确实这样做了,所以这里有一些示例代码:http://pastebin.com/3TkkxGYT

要考虑的另一件事是,如果您的Perform 任务非常小,那么您可能只是测试操作系统的上下文切换而不是其他任何事情。但我不认为它会随着时间的推移自行放缓。

【讨论】:

  • 感谢您的见解我如何为 Future 创建一个数组,它不允许我创建一个。
  • 是的,如果不禁止警告,您将无法做到这一点。您可以创建一个List&lt;Future&lt;Perform&gt;&gt;
  • 我刚刚发布了一些可能对@Vig 有帮助的示例代码。 pastebin.com/3TkkxGYT
猜你喜欢
  • 2014-02-21
  • 2017-09-04
  • 2016-09-28
  • 1970-01-01
  • 2019-03-22
  • 2019-05-25
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多