加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java CPU使用率应该是100%…但不是

发布时间:2020-12-14 05:27:40 所属栏目:Java 来源:网络整理
导读:我在我的Core i7笔记本电脑上运行一个 Java程序,它有8个内核(4个物理,4个HT).该程序使用8个并行线程,因此它应该占用所有的CPU.当使用’-server’参数运行时,它始终处于100%.没有它,总体上约为50%-60%(总是以100%的峰值变化,并以30%的水平下降).这是我发
我在我的Core i7笔记本电脑上运行一个 Java程序,它有8个内核(4个物理,4个HT).该程序使用8个并行线程,因此它应该占用所有的CPU.当使用’-server’参数运行时,它始终处于100%.没有它,总体上约为50%-60%(总是以100%的峰值变化,并以30%的水平下降).这是我发现奇怪的:当我在调试中运行程序并等待CPU使用率特别低(30%)的时候,然后暂停执行以查看八个线程正在执行的操作,它们中没有一个处于阻塞状态.而且,他们之间几乎没有同步.这是我想知道的:

>服务器和客户端VM之间有什么区别,阻止CPU在客户端达到100%?
>在没有同步的情况下,什么可以让线程完全使用核心? (可能链接到1)

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

Edit2:我很确定它是由GC造成的.如果我给VM 1500Mb而不是默认的500Mb,CPU再次达到100%.我认为在服务器模式下不会发生放缓,因为它默认使用更多的内存.

解决方法

如果要监视Java线程正在执行的操作,则不应该在调试模式下运行App并将其挂起.

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

与第二次更新相关,您应该使用时间戳启用GC日志记录,并将减缓/ CPU使用率下降与Young / Full GC集合的时间相关联.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读