【发布时间】:2012-03-21 05:45:00
【问题描述】:
我使用forPool = Executors.newFixedThreadPool(poolSize); 创建了一个固定线程池,其中 poolSize 被初始化为处理器上的内核数(比如说 4)。在某些运行中,它运行良好,CPU 利用率始终保持在 400%。
但有时,使用率会下降到 100%,并且永远不会回升到 400%。我安排了 1000 多个任务,所以问题不在于。我捕获了每个异常,但没有抛出异常。所以这个问题是随机的,不可重现,但非常普遍。它们是数据并行操作。在每个线程结束时,都有一个同步访问来更新单个变量。我极不可能在那里陷入僵局。事实上,一旦我发现这个问题,如果我销毁池并创建一个大小为 4 的新池,它仍然只有 100% 的使用率。没有 I/O。
这似乎违背了 java 对“FixedThreadPool”的保证。我读错了保证书吗?只保证并发而不保证并行?
关于这个问题 - 你遇到过这个问题并解决了吗?如果我想要并行性,我做对了吗?
谢谢!
在进行线程转储时: 我发现有 4 个线程都在执行它们的并行操作。但是使用率仍然只有~100%。这是400% usage 和100% usage 的线程转储。我将线程数设置为 16 以触发场景。它以 400% 运行一段时间,然后降至 100%。当我使用 4 个线程时,它会以 400% 的速度运行,并且很少会降至 100%。 This 是并行化代码。
****** [重大更新] ** ****
事实证明,如果我给 JVM 大量的内存来玩,这个问题就解决了,性能也没有下降。但我不知道如何使用这些信息来解决这个问题。帮助!
【问题讨论】:
-
您是否在“问题阶段”对程序进行了线程转储?
-
@Sanjeev 您的任务是否使用任何类型的同步?因为我们首先要假设你的任务可以完全并行运行。这是你的意思吗?
-
执行的任务是什么——它有 IO 吗?您可以在线程转储为 100% 时捕获线程转储,并查看池中的四个线程在做什么。
-
我正在尝试这样做,但我现在无法调用该场景。我会立即发布结果。
-
这是一个 MemoryInfo 类,可用于在处理时记录内存统计信息:pastebin.com/Mpw3b3yy
标签: java multithreading parallel-processing executorservice