资讯专栏INFORMATION COLUMN

Java程序CPU高占用问题实战分享

IT那活儿 / 567人阅读
Java程序CPU高占用问题实战分享

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


  
对于作为服务器算力的核心部件CPU来说,异常高的占用会影响服务的正常运行。
某个Java应用占用过高CPU,如果不是程序过于复杂需要优化,则可能是程序逻辑有问题,那么如何根据CPU高占用的现象排查程序问题,接下来通过实际案例来演示。

案例一
1. top命令定位CPU高占用Java进程PID.
2. 再使用top -Hp 4315查看该进程下各个线程的cpu使用情况,4315是步骤1中高CPU占用的进程号PID,可观察到前10个线程的CPU占用异常高.
3. 选取步骤2中的一个线程进行分析,需要对其线程号进行进制转换,方便下一步查找.
4. 使用jstack查询具体线程状态.
Jstack 4315 | grep 0x10fd -A 30
可查看线程状态查找关键字向下30行内容,可看到线程状态为RUNNABLE,根据下列内容定位到代码ThreadTestWhile.java第15行。
5. 查看代码逻辑,第15行为死循环,就是它导致了线程一直在运行,占用了过高CPU资源,修改该死循环即可解决问题.

案例二
1. 另外一种情况是可能线程占用资源不是很多,但线程数量过多,海量线程数累计占用了过多资源导致CPU过高,同样使用top命令定位问题进程.
2. 再通过top -Hp 11159查看到异常线程.
3. 选取11183线程进行进制转换.
4. 使用jstack 11159 | grep 0x2baf -A 30查看到该线程状态为WATTING,过多的等待状态线程可能是代码中锁了资源导致线程一直处于等待状态.
5. 本案例代码中是使用了suspend()方法挂起线程,又没有恢复导致的多线程等待,在程序设计时需要注意避免死锁的产生.

总 结

1. 使用top -Hp 定位进程中占用CPU最高的线程,并结合jstack获取线程快照进行分析,如果线程是VM Thread,则应该监控检查垃圾回收活动频率,看是否是因为频繁进行垃圾回收导致的。
2. Java高占用CPU通常原因都是出现了死循环,通过如上方法可以轻易定位到问题,另外空循环会导致间歇性CPU过高,案例一中top的CPU高占用就呈现出间歇性特点。
3. 代码逻辑处理不当可能会导致堆内存无法及时回收导致内存泄漏引起CPU飙升,可结合内存进行问题定位。




本文作者:史鸿杰(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129244.html

相关文章

  • Java多线程学习(七)并发编程中一些问题

    摘要:相比与其他操作系统包括其他类系统有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。因为多线程竞争锁时会引起上下文切换。减少线程的使用。很多编程语言中都有协程。所以如何避免死锁的产生,在我们使用并发编程时至关重要。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)syn...

    dingding199389 评论0 收藏0
  • 实战java并发程序设计第一章

    摘要:通过指令重排可以减少流水线停顿提升巨大效率原则程序顺序原则一个线程内保证语义的串行性。锁规则解锁必然发生在随后的加锁前。线程的方法先于它的每一个动作。 1. 基本概念 同步(Synchronous)和异步(Asynchronous) 并发(Conncurrency)和并行(Parallelism) 临界区 阻塞(Blocking)与非阻塞(Non-Blocking) 死锁(Deadl...

    moven_j 评论0 收藏0
  • 记一次PHP并发性能调优实战 -- 性能提升104%

    摘要:这是多处理器系统中,调度器用来分散任务到不同的机制,通常也被称为处理器间中断,。文章编写计划 待完成: 详细介绍用到的各个工具 作者: 万千钧(祝星) 适合阅读人群 文中的调优思路无论是php, java, 还是其他任何语言都是用. 如果你有php使用经验, 那肯定就更好了 业务背景 框架及相应环境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...

    番茄西红柿 评论0 收藏0
  • 记一次PHP并发性能调优实战 -- 性能提升104%

    摘要:这是多处理器系统中,调度器用来分散任务到不同的机制,通常也被称为处理器间中断,。文章编写计划 待完成: 详细介绍用到的各个工具 作者: 万千钧(祝星) 适合阅读人群 文中的调优思路无论是php, java, 还是其他任何语言都是用. 如果你有php使用经验, 那肯定就更好了 业务背景 框架及相应环境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...

    xeblog 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<