柳州网站建设哪家,重庆市建筑工程,广州市天河区建设局网站,国内高端医疗网站建设问题
订单服务通过MQ进行订单同步时#xff0c;刚启动可以正常消费#xff0c;但是跑一会就会卡住#xff0c;每次都是第8个kafka分区不行再进行消费#xff0c;其他分区消费的很慢。
现象
首先#xff0c;CPU超高#xff0c;达到百分之300多#xff1b;其次#xf…问题
订单服务通过MQ进行订单同步时刚启动可以正常消费但是跑一会就会卡住每次都是第8个kafka分区不行再进行消费其他分区消费的很慢。
现象
首先CPU超高达到百分之300多其次kafka消息消费很慢尤其是第八个分区
分析 由于CPU告警首先想到JVM内存溢出了所以先jstack出内存快照定位导致内存溢出的代码或者可能的原因大致过程 1. 使用top查看系统的资源占用情况 2. 使用ps命令查看进程对应的是哪个程序 3. 使用top -p [PID] -H 观察该进程中所有线程的资源占用 4. 使用jstack查看线程快照 5. 定位出现的问题 参考地址 导出内存快照放到MAT上进行分析定位到是一个static方法内存溢出了 但是代码逻辑没有问题所以一时间没有找到问题。 鉴于上面没有分析出来结果又从GC日志中找结果 发现频繁的 Young GC都是失败的。到这里还是没有很好的思路后来通过打印日志确认到了一个订单只有70多万个商品再处理商品的逻辑中又使用了多层for循环进行处理导致栈内存溢出。
结论
大数据导致内存溢出在这个大数据处理逻辑中存在不合理代码所以导致了内存溢出。
在排查的过程中我们还升高了metaspace的内存但是还是瞬间被占用满导致CPU飙升到百分之800左右。一味堆配置并不能一劳永逸的解决问题。
工具
MAT 进行内存分析gceasy进行GC日志分析
参考
java程序CPU使用率高可能的原因
Mat使用详解
内存快照两种方式
jmap 进行快照导出
输出快照
jmap -dump:formatb,file/usr/local test1.hprof 2778第二种直接通过jstack进行查看先top -h 进程ID - H查询出线程ID再转为十六进制的进而执行下面的命令
jstack 5739 | grep -A 100 nid0x1802材料
gc log