【发布时间】:2012-03-21 10:12:15
【问题描述】:
我们正在使用相当多的 ExecutorServices 运行服务。
当使用 jProfiler 7.1 (sampling, Runnable) 分析服务时,我们可以看到 sun.misc.Unsafe.park + unpark 是当前在热点中使用大部分 CPU 时间的调用。
http://i.stack.imgur.com/wT2Cj.jpg
这令人费解。
Park 和 unpark 应该是阻塞的,因此不使用任何 CPU 周期(或至少少量)。 这是来自 jprofiler 的某种错误(即没有检测到它,因为它在 sun.misc 包中?)还是我们在使用 ExecutorService 框架时实际上有问题?
【问题讨论】:
-
您是否有可能附加了一个可能会暂停某些线程的调试器?
-
不,没有附加调试器。此外,正如跟踪所暗示的那样,大部分“时间”都花在了 ExecutorService 的 getTask 部分中
-
我们希望这只是 jProfiler 中的一个“错误”。我很难相信 Executor 服务中的 Worker 线程实际上在等待任务时正在消耗周期。
-
@RasmusFuglsang 我想说这更有可能是 jProfiler 中的一个错误。例如,我知道 hprof 在输入方法之前和之后都需要一个开始时间。可能 jprofiler 没有考虑线程的暂停并将其计为花费的时间
-
@RasmusFuglsang JProfiler 支持在这里,它看起来确实像一个错误。这当然不是正常行为,并且不会发生在我们的测试用例和我们测试的 JVM 中。 Unsafe.park() 和 Unsafe.unpark() 是特殊方法,由我们专门处理。 “JDBC 示例”会话是否也会发生这种情况(它也使用线程池)?请写信至 support@ej-technologies.com,详细了解您正在使用的 JVM 版本以及运行已分析 JVM 的平台。
标签: java multithreading sun jprofiler