java - Java有自动并行化吗?

标签 java multithreading optimization sysinternals process-explorer

我编写了一个计算量大的单线程程序,但当我执行它时,我惊讶地发现我的四核处理器的利用率为 95%。我预计利用率会接近 25%(一个核心)。我使用了 sysinternals 中的 Process Explorer,更惊讶地发现 Java 进程有 6 个线程,负载分布几乎相同,大约占总处理器时间的 16%。

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

看起来 Java 似乎正在以某种方式自动并行化我的代码,但网上的所有内容都告诉我这不可能是真的。有谁知道这是怎么回事吗?

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

系统空闲 - 1% 负载。我使用的是带有 8 个逻辑核心的四核 CPU。 System at Idle

我的非并行 java 程序正在运行。请注意,所有 4 个核心都已接近极限: run

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

最佳答案

在我使用过的大多数系统上,使用百分比实际上是进程正在使用的一个核心功率的百分比。如果您的系统是这样的,那么您只是误解了使用百分比。也就是说,java 正在使用 一个 CPU 的 95%。不确定这是否是正在发生的事情,但这可以解释一个未并行的程序如何能够显示 95%。

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

关于java - Java有自动并行化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34505146/

相关文章:

java - 在 BlackBerry 中访问互联网执行 POST 的不同方式

java - 如何从 Jena 获取嵌套的 RDF/XML?

java - arraylist/atomic double array (Google Guava) 中的 .get() 操作是线程安全的吗?

c++ openssl 1.1.1在线程中运行RSA算法导致内存泄漏

angular - 如何正确使用OnDestroy

java - 文件写入jar中的资源文件夹中

java - 为什么原始数据类型的内存是固定的?

c++ - 如何在不终止程序的情况下停止 std::thread 的运行

C: 我可以让我的程序看起来在 0 秒内运行吗

iphone - 在 iPhone 应用程序中保存数据并下次读取数据的最快方法是什么?