【发布时间】:2014-08-04 01:08:50
【问题描述】:
我有一些多线程 Java 代码。我知道我产生了三个线程。我有六个内核,所以我希望看到我的 CPU 使用率在 0% 和 50% 之间跳跃。但是,在添加了一些新的内存密集型操作后,我看到 CPU 使用率上升到了 100%——使用了我机器的所有六个内核。
这里发生了什么?这是垃圾收集器在工作吗?
【问题讨论】:
-
您可以获取 Java 分析器并亲自查看在任何给定时刻正在运行的内容。否则,我们只能猜测。
-
我必须每个核心有 2 个线程。我只在一个线程中进行了一些计算,发现四个线程中有两个的使用率约为 40%。其他核心的使用率约为 1-5%。如果您的 CPU 有三个内核,每个内核有两个线程,那么 JVM 可能正在执行分布在物理内核上的计算,而不是内核中的线程。只是一个想法......
-
如果没有一些代码,这很难说。例如,从 Java 8 开始,JVM 积极尝试以尽可能多的并行性处理新流 API 的指令。此外,GC 驻留在自己的线程中。正如 Theodoros 已经建议的那样,使用分析器并发布其结果。
-
我不确定是否可以提取足够小的代码区域作为示例。我会尝试在分析器下运行它,看看发生了什么。我只是感到惊讶,因为作为 C 程序员,我知道如果我生成三个线程,最多将使用三个 CPU。我假设其他 CPU 负载是 JVM 正在做的一些后台工作,但我不确定是什么。
-
通常处理器利用率以每个内核 100% 来衡量。因此,在您的情况下,完整的 6 核使用率将是 600%。我认为您在实用程序中查看了错误的属性,因此当任务较轻时,它们仅消耗每个内核的 50%,而当任务繁重时,每个内核的 CPU 使用率增加 100%。
标签: java multithreading garbage-collection