测试环境频繁Full GC问题的解决思路分析

 更新时间:2025年01月03日 08:43:22   作者:莱特昂  
全文介绍了作者通过与调用方交互,发现welink-front服务不可用的问题,通过jmap-heap和jstat-gccause命令,作者找到了问题的原因是元数据区内存使用率过高,触发了FullGC,作者通过分析GC日志和堆内存使用情况,确定了问题的根本原因

背景

上游调用方,反馈当前welink-front服务不可用;

临时解决办法

手动重启welink-front服务,重启之后观测到业务日志正常刷,说明该问题暂时得到了解决;

但没过多久,上游调用方的同学又找来了,反馈当前服务又不可用了,果然该来的总是会来;

现象

直接jmap -heap [pid]打印堆内存大小,瞧着内存使用情况挺正常的;

gc日志显示,当前java服务在频繁的进行FullGC;

这里有个点,就是FullGC后,堆可用内存大小基本没怎么变化,GC了个寂寞;

细细想来,FullGC的原因无非那么几种:

  • 1、实际业务导致堆内存短时间内暴增,例如高并发场景;
  • 2、大对象;
  • 3、内存泄漏,老年代存在大量释放不掉的对象;
  • 4、元数据区满了;
  • 5、堆外内存;
  • 6、System.gc();

其实纠结那么多干嘛,直接jstat -gccause [pid]看GC原因就好了;

其实到这里就很明了了,元数据区内存使用率97.26%,上次GC原因为:Metadata GC Threshold,当前GC原因为:Last ditch collection;

  • Metadata GC Threshold:metaspace空间不能满足分配时触发,这个阶段不会清理软引用;
  • Last ditch collection:经过Metadata GC Threshold触发的full gc后还是不能满足条件,这个时候会触发再一次的gc cause为Last ditch collection的full gc,这次full gc会清理掉软引用;

到这里基本可以断定,就是元数据区内存不够霍霍了;根据前面堆内存打印显示,元数据区内最大为128M;这个也跟前面GC日志的结果相吻合;

所以解决方案就是直接调大堆内存和元数据区内存;

为什么是直接调大元数据区的内存大小呢?

是因为在测试环境的发布模板中,我们通常会直接将内存调小;

反思与总结

测试环境的问题,发现了应当立即定位分析根本原因,然后评估影响并确定解决方案,不要把悬念带上生产;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java将日期类型Date时间戳转换为MongoDB的时间类型数据

    Java将日期类型Date时间戳转换为MongoDB的时间类型数据

    今天小编就为大家分享一篇关于Java将日期类型Date时间戳转换为MongoDB的时间类型数据,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Spring Cloud下OAUTH2注销的实现示例

    Spring Cloud下OAUTH2注销的实现示例

    本篇文章主要介绍了Spring Cloud下OAUTH2注销的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java中字符串常见的拼接方式小结

    Java中字符串常见的拼接方式小结

    在Java中,字符串拼接是开发过程中非常常见的操作,根据不同的需求和性能考虑,有多种方式可以实现字符串的拼接,本文给大家介绍了五种拼接方式,并通过代码讲解的非常详细,需要的朋友可以参考下
    2024-10-10
  • 举例讲解Java编程中this关键字与super关键字的用法

    举例讲解Java编程中this关键字与super关键字的用法

    这篇文章主要介绍了Java编程中this关键字与super关键字的用法示例,super是this的父辈,在继承过程中两个关键字经常被用到,需要的朋友可以参考下
    2016-03-03
  • shardingJdbc3.x 版本的分页bug问题解析

    shardingJdbc3.x 版本的分页bug问题解析

    这篇文章主要为大家介绍了shardingJdbc3.x 版本的分页问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • java中如何使用泛型方法比较大小

    java中如何使用泛型方法比较大小

    这篇文章主要介绍了java中如何使用泛型方法比较大小,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • SpringBoot中Excel处理完全指南分享

    SpringBoot中Excel处理完全指南分享

    这篇文章主要介绍了SpringBoot中Excel处理完全指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java ConcurrentHashMap的使用示例

    Java ConcurrentHashMap的使用示例

    这篇文章主要介绍了Java ConcurrentHashMap的使用示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • Java Jwt库的简介及使用详解

    Java Jwt库的简介及使用详解

    JWT 是开放的行业标准RFC7591,用来实现端到端安全验证,就是通过一些算法对加密字符串和JSON对象之间进行加解密,下面通过本文给大家介绍Java Jwt库的简介及使用,感兴趣的朋友一起看看吧
    2021-11-11
  • 深入了解Java中Synchronized的各种使用方法

    深入了解Java中Synchronized的各种使用方法

    在Java当中synchronized关键字通常是用来标记一个方法或者代码块。本文将通过示例为大家详细介绍一下Synchronized的各种使用方法,需要的可以参考一下
    2022-08-08

最新评论