栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记录一次JVM排查

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录一次JVM排查

服务器 LINUX Java 程序占用 CPU 过高排查方法: 首先找到 CPU 占用高的 Java 进程 PID,使用 top 命令;

top

之后使用 shift + p 按照 cpu 排序,查到的pid 为 80136

接下来使用 top -Hp pid ,然后使用 shift+p 按cpu排序,查找出来占用 cpu 高的线程 threadId。

top -Hp 737

之后使用 shift + p 按照 cpu 排序
查到的对应 threadId 为 741.

接下来使用 printf ‘%xn’ threadId ,将上一步找到的 pid 转换成 16 进制;

printf ‘%xn’ 741
输出结果为2e5

之后使用 jstack 获取线程信息 jstack PID | grep threadId

jstack 737 | grep 2e5

我们就能找到是哪个线程占用 cpu 高

最后使用 jstack pid(进程pid)>stack.dump 将进程堆栈打印出来

jstack 737>stack.dump

然后分析一下对应线程里面堆栈的调用关系,看看我们业务代码哪个方法使用cpu高。

最后通过:eclipse memory analyzer 分析:如下图所示

ZooKeeper#ClientCnxn#EventThread 无界队列积压了太多的任务;导致消费不过来啦;

问题原因:

因为我们是通过Elastic-job执行任务的, 在业务代码中,有很多 耗时的长任务,但是他的触发时间为 1s执行一次,但是消费跟不上。积压的任务频繁的FULL-GC、CPU高居不下;

处理方法:

通过设置 Elastic-job 的 :misfire 设置为:false(默认为true),这样就不会有短时间大量的积压任务

参数解释:

1、如果一个任务JOB的调度频率为每10s一次,在某个时间,该job执行耗时用了33s(平时只需执行5s),按照正常调度,应该后续会触发3次调度,那该job后执行完,会连续执行3次调度吗?
答案:在33s这次任务执行完成后,如果后面的任务执行在10s内执行完毕的话,只会触发一次,不会补偿3次,因为ElasticJob记录任务错失执行,只是创建了misfire节点,并不会记录错失的此时,因为也没这个必要。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971027.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号