首页 > 其他 > 详细

记一次cpu占用过高问题

时间:2021-08-23 20:19:51      阅读:22      评论:0      收藏:0      [点我收藏+]

top -s

技术分享图片

 

 

ps -ef | grep 17996

 

ps -mp pid -o THREAD,tid,time

 

将需要的线程ID转换为16进制格式:

printf “%x\n” tid

 

打印线程的堆栈信息:

jstack pid |grep tid -A 30

 

jstack 32236 | grep ‘7dec‘

 

jstack -l 32236 > jstack_result2.txt

 

jstat -gcutil 32236 2000

 

发现频繁GC FGC>YGC

估计是代码层面的问题了,很多数据无法释放,或者一次性把老年代填满了

技术分享图片

 

 

技术分享图片

 

 

打算导出堆栈,耗时较久

技术分享图片

 

 

看看内存里有哪些数据对象

或者导出下内分布

jmap -histo [pid]  > class.text

技术分享图片

 

 

jmap -histo 32236 | more

技术分享图片

 

 

 

jmap -histo 17996 | head -30

技术分享图片

 

 

看下来

这个对象几十万个

应该是从数据库拿出来数据太多了

 

看了代码以后定位到问题

 技术分享图片

 

  1. 使用top命令,查看cpu占用过高的java PID (如PID=9876)
  2. 使用ps aux|grep PID   (ps aux|grep 9876)查看是那个java程序占用cpu 。
  3. ps -mp PID -o THREAD,tid,time  (ps -mp 9876-o THREAD,tid,time)显示线程列表,找出线程列表中占用cpu过高的tid (如tid=6789)
  4. printf "%x\n" tid  (printf "%x\n" 6789)将其tid转化为16进制格式 如68b9
  5. jstack pid |grep tid -A30 >> /tmp/jstack.log  (jstack 9876 |grep 68B9 -A30 )   打印对应的堆栈信息,查看具体原因

记一次cpu占用过高问题

原文:https://www.cnblogs.com/alter888/p/15177258.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!