我在我的 Core i7 笔记本电脑上运行一个 Java 程序,它有 8 个内核(4 个物理,4 个 HT)。该程序使用 8 个并行线程,因此它应该耗尽所有 CPU。使用“-server”参数运行时,它始终处于 100%。没有它,它总体上大约是 50%-60%(总是随着 100% 的峰值和 30% 的下降而变化)。这就是我觉得奇怪的地方:当我在调试中运行程序并等待 CPU 使用率特别低 (30%) 的片刻,然后暂停执行以查看八个线程在做什么时,它们都没有处于阻塞状态. 此外,它们之间几乎没有同步。这就是我想知道的:
- 服务器和客户端虚拟机之间有什么区别会阻止客户端的 CPU 达到 100%?
- 在没有同步的情况下,什么可以阻止线程完全用完内核?(可能与1有关)
编辑:这是一个想法:代码分配大数组并很快将它们留给 GC。调用“new SomethingBig()”并分配该内存需要时间时,线程是否休眠?如果虚拟机中有一个进程处理一堆线程的分配,我想这可以解释为什么它们似乎在同步块之外随机暂停......
Edit2:我很确定它现在是由 GC 引起的。如果我给 VM 1500Mb 而不是默认的 500Mb,CPU 会再次达到 100%。我认为减速不会发生在服务器模式下,因为它默认使用更多内存。