Java CPU使用率应该是100%......但事实并非如此

sch*_*mop 10 java multithreading jvm

我正在我的Core i7笔记本电脑上运行一个Java程序,它有8个核心(4个物理,4个HT).该程序使用8个并行线程,因此它应该耗尽所有CPU.使用'-server'参数运行时,它始终为100%.如果没有它,它总体上大约在50%-60%之间(总是在100%的峰值和30%的下降时变化).这就是我觉得奇怪的事情:当我在调试中运行程序并等待CPU使用率特别低(30%)然后暂停执行以查看八个线程正在做什么时,它们都没有处于阻塞状态.而且,它们之间几乎没有同步.这就是我想知道的:

  1. 服务器和客户端VM之间有什么区别会阻止CPU在客户端达到100%?
  2. 在没有同步的情况下,什么可以阻止线程完全耗尽核心?(可能与1相关)

编辑:这是一个想法:代码分配大数组并很快将它们留给GC.调用'new SomethingBig()'并分配该内存需要时间时线程是否会休眠?如果VM处理一组线程的分配中有一个进程,我想这可以解释为什么它们似乎在同步块之外随机暂停......

编辑2:我很确定它是由GC引起的.如果我给VM 1500Mb而不是默认的500Mb,则CPU再次达到100%.我认为在服务器模式下不会发生减速,因为它默认使用更多内存.

Ale*_*leš 2

如果您想监视 Java 线程正在做什么,则不应在调试模式下运行应用程序并挂起它。

相反,您应该在 CPU 使用率下降的特定时间间隔内收集线程转储。kill -3 <pid>

与第二次更新相关的是,您应该启用带有时间戳的 GC 日志记录,并将速度减慢/CPU 使用率下降与 Young/Full GC 收集的时间相关联。