记一次线上GC问题排查

 1. 记一次线上GC问题排查

  1. 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

     

  2. 启动 VisualVM,打开堆 dump 文件,显示内存不够,更改启动参数,重新启动 jvisualvm

    jvisualvm -J-Xmx8096M
  3. 加载堆文件, DefaultTransaction占用大小1个G,且未关闭

  4.  

  5. 存在大量的DefaultTransaction 对象,栈过深。看字段与代码符合:

  6. 分析为线上transaction 对象过多,且处于未 complete 状态,造成对象未回收,感觉像是年轻代被回收,升级为大对象,进入老年代,造成FullGC

  7. 初步怀疑是Rhino 本身bug或降级使用不当引起,下周看源码接着排查

  8. 与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 手动降级导致的,但未复现

 

原文地址:https://www.cnblogs.com/jjfan0327/p/13434024.html