【问题标题】:Does Java have automatic parallelization?Java有自动并行化吗?
【发布时间】:2015-12-30 03:18:11
【问题描述】:

我编写了一个计算量很大的单线程程序,但是当我执行它时,我惊讶地发现我的四核处理器的利用率达到了 95%。我期待看到接近 25% 的利用率(一个核心)。我使用了来自 sysinternalsProcess Explorer,进一步惊讶地发现 Java 进程有六个线程,负载分布几乎相同,约占总处理器时间的 16%。

最初我计划并行化我的代码,但现在看来我不会获得任何性能,因为即使使用非并行代码,CPU 已经处于 95% 的负载。

Java 似乎以某种方式自动并行化了我的代码,但网上的一切都告诉我,这不可能是真的。有谁知道怎么回事?

编辑:我添加了一些屏幕截图,希望能回答以下一些问题:

系统处于空闲状态 - 1% 负载。我正在使用具有 8 个逻辑内核的四核 CPU。

我的非并行java程序正在运行。请注意,所有 4 个核心几乎都已用尽:

从 SysInternals Process Explorer 查看我的非并行 java 程序。注意负载几乎相同的 8 个线程:

【问题讨论】:

  • 大多数系统将使用率显示为一个 cpu 充分利用的百分比。因此,在充分利用的情况下,您的程序将达到 400%。不确定这是否是您的问题,但您肯定有可能只是误解了。
  • 还可以使用专门的 java 工具,如 jmc、jconsole 或 jstat 来查看发生了什么。可能是 Java 堆接近 OutOfMemory 导致 GarbageCollector 烧毁 CPU。
  • 嗨,史蒂夫,您的所有 CPU 内核的使用率都达到了 95% 吗?
  • 向我们展示您的代码。一些新的 Java 8 流可以进行自动多线程。

标签: java multithreading optimization sysinternals process-explorer


【解决方案1】:

在我使用过的大多数系统上,使用百分比实际上是进程正在使用的一个内核功率的百分比。如果您的系统是这样的,那么您只是误解了使用百分比。也就是说,java 正在使用 95% 的 one CPU。不确定这是否是怎么回事,但它可以解释一个无与伦比的程序如何以 95% 显示。

编辑:根据您的编辑,情况似乎并非如此。也许就像 cmets 中的 @a_horse_with_no_name 所暗示的那样,您的代码正在使用并行流或其他自动并行化操作?

【讨论】:

  • 没有。 Windows 任务管理器报告所有内核的 CPU 使用率。使用 8 个内核,单个完全繁忙的内核将导致任务管理器中的 CPU 使用率为 12%。而且第二张截图还显示,所有 8 个内核都在忙碌,而不仅仅是一个。
【解决方案2】:

Java 没有并行化您的代码。 Java 正在并行化自己。请记住 Java 在虚拟机中运行。该虚拟机本身就是一个程序。

【讨论】:

    最近更新 更多