记一次线上GC问题排查
1. 记一次线上GC问题排查
-
dump 过程
-查询线上JAVA进程号 ps -ef | grep java -切换用户 sudo -iu sankuai -dump JAVA heap信息 jmap -dump:file=heap-12-09 {pid} -移动到tmp路径好传输到本地分析 mv /home/sankuai/heap-12-09 /tmp/ -传输问题件:存在权限不允许问题,打开设置-共享 scp -r /tmp/heap-12-09 wangjie@172.30.129.66:/Users/wangjie/Downloads -JAVA8工具路径 /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
-
启动 VisualVM,打开堆 dump 文件,显示内存不够,更改启动参数,重新启动 jvisualvm
jvisualvm -J-Xmx8096M
-
加载堆文件, DefaultTransaction占用大小1个G,且未关闭
-
-
存在大量的DefaultTransaction 对象,栈过深。看字段与代码符合:
-
分析为线上transaction 对象过多,且处于未 complete 状态,造成对象未回收,感觉像是年轻代被回收,升级为大对象,进入老年代,造成FullGC
-
初步怀疑是Rhino 本身bug或降级使用不当引起,下周看源码接着排查
-
与Rhino 沟通发现,cquery 使用的是 1.2.4.3 版本,1.2.4.3被替换过,部署构建的时候用的缓存中的旧jar包,未选择清除缓存。
相关引用:
https://docs.sankuai.com/dp/arch/cat/bigReport/faq/#20cat-stack:
这个问题就是cat新建Transaction对象没有被关闭, cat默认是树层次结构, 会嵌套, 如果一直没有关闭, 就会导致堆栈溢出, 最终导致内存fullgc
该问题与本次问题堆栈信息一致,而且同样是操作 Rhino 手动降级导致的,但未复现