首页 > 其他分享 >【JVM】记录一次线上服务频繁FGC的排查过程

【JVM】记录一次线上服务频繁FGC的排查过程

时间:2024-01-13 16:11:31浏览次数:30  
标签:缓存 排查 内存 JVM arthas 推送 模板 FGC

一.背景

  最近在Grafana关注到线上推送服务push-service在运行一段时间后,内存占用非常高,并且频繁发生FGC,这里记录下问题排查过程

二.排查过程

    推送服务主要作用为,消息推送,因此JVM内存这里分配的是 Xmx 和Xms 均为2G
  1. 首先在Grafana上的监控指标,可以看到FGC非常频繁,一小时内发生了多次FGC

 

  2.进入容器内找到对应的服务实例,使用jmap 或者 arthas 可以看到对应实例的内存占用实际情框

      --- jmap 查询过程
                1.ps -ef 查看当前所有进程,找到对应服务名的进程pid
                2.jmap -heap  pid

      --- arthas查询过程(注意在使用arthas分析内存导出dump日志时,尽量把当前服务实例下线,避免影响线上服务)
                1.启动arthas,attach 到指定的Java进程
                2.输入dashboard查询进程的内存和CPU等信息

 

    3.这里以arthas 为例,导出内存快照文件

    使用heapdump命令,导出文件

 

     4.使用JProfile打开dump文件,如下图所示,可以看到HashMap$Node有340W个对象,且在最大对象图示中,占用了700M的内存空间,这里我们重点分析这个类

 

     
    如下图,查看引用链,可以看到ConcurrentHashMap对象被SimpleViewResolver传递引用,表示SimpleViewResolver间接持有 ConcurrentHashMap对象,因此ConcurrentHashMap对象没有被回收掉

 

    这里,我们可以就可以找到大致的出现内存泄漏的代码位置,找到SimpleViewResolver 和 SimpleTemplateEngine 

    最后跟踪源码,发现推送服务引入Groovy脚本框架,实现模板信息的缓存,但在实际上,每次推送时,根据模板ID查询模板信息后,即时模板缓存不存在,查询结果并没有缓存模板信息,导致GroovyClassLoader对象中的属性,每次查询都会生成一个HashMapNode对象,Map对象中的元素不断增加

     5. 解决方案
      方案1:在每次推送时,增加缓存的逻辑,这块是盖起来最快的方案,可以作为短期方案
      方案2:修改Groovy脚本框架源码或使用新的缓存框架, 目前这块改造耗时较高,可以作为长期方案

    
    

标签:缓存,排查,内存,JVM,arthas,推送,模板,FGC
From: https://www.cnblogs.com/july-sunny/p/17962465

相关文章

  • JVM7(GC 分代收集算法 VS 分区收集算法)
    1.分代收集算法当前主流VM垃圾收集都采用”分代收集”(GenerationalCollection)算法,这种算法会根据对象存活周期的不同将内存划分为几块,如JVM中的新生代、老年代、永久代,这样就可以根据各年代特点分别采用最适当的GC算法1.1.在新生代-复制算法每次垃圾收集都能发......
  • JVM6(JAVA 四中引用类型)
    强引用在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。软引......
  • 科来TAP交换机丢包排查
    参考:https://zhiliao.h3c.com/EnclosureTechDoc/ziliao/16788451248789.pdfhttps://www.cnblogs.com/justin-y-lin/p/14783362.htmlhttps://support.huawei.com/enterprise/zh/doc/EDOC1100087023微突发厂商工程师经过检查调试,变更了缓存模式使overfifo正常了,执行了2条命令de-dupl......
  • [转帖]日常Bug排查-读从库没有原子性?
    https://zhuanlan.zhihu.com/p/658508920 3人赞同了该文章日常Bug排查系列都是一些简单Bug排查。问题虽小,但经常遇到,了解这些问题,会让我们少走点弯路,提升效率。说不定有些问题你遇到过哦:)Bug现场业务开发同学突然问了笔者一个问题,从库读会不会没有原子性?我下意......
  • JVM 21 调优指南:如何进行JVM调优,JVM调优参数
    聊聊关于JVM21的优化指南。这篇文章将会深入探讨如何进行JVM调优,介绍一些关键的JVM调优参数,并提供12个实用的代码示例。由于篇幅较长,我会分几个部分来详细讲解本文已收录于,我的技术网站ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享JVM调优概览JVM(Java虚拟机)调优是......
  • 《实战Java虚拟机 JVM故障诊断与性能优化》读书
    最近读了《实战Java虚拟机JVM故障诊断与性能优化》这本书,有一些收获,特此记录1.有Java虚拟机规范,各大厂商根据规范自己实现VM,大家平常用的是Hotspot2.堆一般分为新生代,老年代。新生代里又分成伊甸园区,from区,to区。一般对象是在伊甸园区出生,经过垃圾回收进入fromto老年代3.J......
  • EasyCVR使用RTMP推流但是通道显示不在线的原因排查
    安防视频监控平台EasyCVR采用了开放式的网络结构,支持高清视频的接入和传输、分发,平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,此外,国标GB28181高清可视化视频监控云平台EasyCVR......
  • 安防视频监控平台EasyCVR使用RTMP推流但是通道显示不在线的原因排查
    安防视频监控平台EasyCVR采用了开放式的网络结构,支持高清视频的接入和传输、分发,平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,此外,国标GB28181高清可视化视频监控云平台EasyCVR......
  • JVM---内存分析工具
    离线工具需要先使用 jmap导出dump文件IBMHeapAnalyzerhttps://www.ibm.com/support/pages/ibm-heapanalyzer     在线工具arthasprofilerhttps://arthas.aliyun.com/doc/profiler.html火焰图的含义  https://blog.csdn.net/qq_43692950/article/deta......
  • JVM5(垃圾回收与算法)
    1.如何确定垃圾1.1.引用计数法在Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都不为0,则说明对象不太可能再被用到,那么......