首页 > 其他分享 >白名单膨胀引发的线上gc频繁问题分析

白名单膨胀引发的线上gc频繁问题分析

时间:2023-05-26 14:14:34浏览次数:46  
标签:1.1 XX gc 内存 白名单 younggc 膨胀

一、问题是怎么发现的

  1. 早上首页中心出现了多台机器的mdc内存报警,观察mdc内存曲线,发现内存在缓慢增加且较往常增幅稍大。
  2. 观察jvm的gc和内存情况,没有fullgc,但是yonggc和内存的曲线比较紊乱,且在凌晨仍younggc频繁。
  3. 打开线上京麦首页,暂未发现明显异常。

二、问题带来的影响

  1. yonggc和内存的曲线比较紊乱,younggc较往常更为频繁,会影响首页中心的接口性能,进而影响京麦首页用户体验。

三、排查问题的详细过程

  1. 观察jvm的gc和内存曲线,往前追溯,发现在前一天18点50分左右曲线出现了异常。
  2. 首页中心最近并未操作线上发版和配置修改,只有在前一天18点50分上传了一份白名单文件,初步猜测gc异常和上传的文件有关。
  3. 为了进一步验证猜想,观察预发环境的gc和内存曲线,和线上吻合。关闭预发环境的白名单更新定时任务,预发环境gc和内存曲线恢复正常。

起因

  1. 前一天18点50分,上传了一份白名单文件到oss,是替换操作,这个白名单文件之前是7W+商家,替换后是11W+商家,文件大小1.1M。
  2. 白名单更新机制:定时任务每1min下载一次白名单文件,读取文件流获取所有名单,组装集合更新到内存中。

四、如何解决问题

按需更新:
oss下载文件时能获取到更新时间戳。第一次下载时,将该时间戳保存到内存中。后续下载文件时每次都与内存中的时间戳进行比对,如果有更新才会去下载文件流,然后更新内存中的时间戳。否则视为未修改文件,直接关闭文件流下载。

五、问题分析:为什么1.1M的文件定时任务下载会导致gc异常

问题截图

younggc异常开始,内存泄漏?

image.png

younggc解决了内存泄漏的问题?

image.png

曲线解释

-Xmx5440M
-Xms5440M
-XX:MaxMetaspaceSize=512M
-XX:MetaspaceSize=512M
-XX:MaxDirectMemorySize=1G
-XX:+UseG1GC 
-XX:MaxGCPauseMillis=100
-XX:+ParallelRefProcEnabled
-XX:ParallelGCThreads=4
-XX:CICompilerCount=3

① 内存和gc曲线不规律,会周期性地出现短时间内多次younggc
分析:
G1垃圾回收器什么时候执行younggc?eden区空间不足时执会行younggc,但是从曲线看在堆内存很低的时候仍会进行younggc,说明G1中的eden区大小是动态变化的。
知识点:
G1为了达到承诺的最大gc停顿时间,会动态调整eden区的大小。

注:G1想要降低停顿时间,就会调低eden区大小,下次younggc要处理的垃圾变少了,自然gc停顿时间就变短了。

问题:那么为什么younggc不和以前一样正常gc,而是变得紊乱了呢?继续往下看

② 一直有younggc但是gc后留下的内存整体呈上升状,出现内存泄漏的现象
分析1:
内存泄漏,却并没有出现内存溢出。一般这种情况,会出现fullgc清理掉那部分younggc无法处理的垃圾。但是没有出现fullgc,而是在频繁的younggc中内存曲线又回归低位,似乎是进行了一次特殊的younggc?
知识点1:
特殊的younggc叫mixedgc,更准确地说叫并发标记周期,因为实际情况,这里并没有发生mixedgc,而是发生了并发标记周期。(发生mixedgc前置条件是发生了并发标记周期,发生并发标记周期前置条件是发生了younggc)

分析2:
1.1M的文件下载存储到了内存中,或者说产生了1.1M的对象,然后就出现了gc异常,而且是产生了质变,但是0.7M的对象却没事?那么咱们可以猜测异常和对象的大小有关系,0.7M和1.1M中间的1M是否就是一个阈值呢?
知识点2:
region大小计算:region=max((xmx+xms)/2*2048,1m),同时region大小必须是2的次幂,最终得到首页中心region大小为2M。
G1认为只要大小超过了一个Region容量一半的对象即为大对象,大对象在G1里面单独存放区域是Humongous Region。Humongous Region可以认为是一系列连续的region,一般来说也被当做老年代,是不会被younggc清理的(有实验性质的参数可以让younggc清理Humongous region)。

结论:
① 定时任务产生的1.1M的大对象,无法被younggc清理,所以会呈现内存泄漏的现象。
② 没有发生内存溢出,是因为在并发标记周期过程中,会进行Humongous Region的清理,所以可以看到内存曲线恢复正常。
③ younggc变得紊乱:一方面,无法被younggc清理的Humongous Region被视作老年代,本身就积压了eden区的大小。另一方面,因为1.1M的大对象里面的string对象被引用,所以这部分没有被放到Humongous Region,但是younggc也无法清理,只能是younggc后被复制到S0或S1区,这导致了younggc的时间变长,所以下次younggc时会调整eden区大小来达到gc目标停顿时间的要求。

注:这里1.1M的大对象有多个,每个1.1M的大对象都会占用一个2M的region,也浪费了内存。

六、总结反思:是否可以更快发现问题?如何再次避免等。

① jvm的younggc次数设置不敏感,MDC的内存报警无法直观的体现问题
② java应用的jvm参数设置针对不同类型的应用会有不同的最佳实践,垃圾回收器针对大对象
③ jvm的gc监控目前来看并不能区分G1的younggc和并发标记周期。

标签:1.1,XX,gc,内存,白名单,younggc,膨胀
From: https://www.cnblogs.com/nanzhuli/p/17434552.html

相关文章

  • 设计师解放双手之作!3秒生成风景园林效果图,AIGC赋能景观设计
    项目简介在过去几十年,风景园林经历了从“刀耕火种”的完全手绘设计时代到当下比较流行的参数化设计时代,过去的每一轮技术革新都让风景园林作品的表现形式产生了巨大的改变。随着计算机图像技术的发展,我们有更多的建模和渲染软件辅助提升图纸表现效果,但表现效果提升的背后伴随的是越......
  • SpringBoot2.0实现SpringCloud config自动刷新之坑点
    在使用rabbitmq之后并不能实现客户端的配置自动刷新,原因是我参考的资料都是springboot1.x的,Springboot2.0的改动较大,之前1.0的/bus/refresh全部整合到actuador里面了,所以之前1.x的management.security.enabled全部失效,不适用于2.0适用于2.0的配置是这样的:management:endpoin......
  • springCloud
    typora-root-url:assetsSpringCloud1.什么是springcloudspringcloud是目前国内使用最广泛的微服务springcloud集成了各种微服务功能组件,并基于springboot实现组件的自动装配,提供了良好的开箱体验另外,SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下......
  • 华为无线基于黑白名单认证上网
    白名单:存在白名单内的MAC在接入到无线网络时会直接允许接入,没有存在白名单内的则不允许访问黑名单:存在黑名单内的MAC不允许直接接入,没有存在黑名单内的则可以直接连接白名单配置......
  • 查看gcc/g++版本以及对应默认的的C++标准
    通过如下命令查看_cplusplus的值:g++-dM-E-xc++/dev/null|grep-F__cplusplus对应查表C++标准_cplusplusC++11201103LC++14201402LC++17201703L ......
  • springcloud 第一个项目遇到的报错
    在创建模块springcloud-provider-8001的时候出现两个错误,一个是CLASSNOTFOUND,另一个是错误的类文件:/D:/apache-maven-3.8.8/maven-repo/org/springframework/spring-beans/6.0.4/spring-beans-6.0.4.jar!/org/springframework/beans/factory/annotation/Autowired.class   ......
  • upload靶场总结12-21白名单
    PHP版本为5.5.9nts版本第十二关白名单校验(GET型0x00截断)漏洞描述:使用白名单限制上传文件类型,但上传文件的存放路径可控利用方法:设置上传路径为upload/phpinfo.php%00,添加phpinfo.php%00内容为了控制路径,上传文件后缀为白名单即可例:test.jpg,保存后为/upload/phpinfo.......
  • 【服务治理】基于SpringCloudAlibaba微服务组件的灰度发布设计(二)
    一.背景在上文中,灰度发布遇到了些问题,例如:1.动态修改Nacos配置中心的元数据信息,如何同步到Nacos注册中心对应服务的列表中2.管理后台业务调用其它服务灰度实例时的路由规则二.解决方案//TODO ......
  • Python从0到1丨了解图像形态学运算中腐蚀和膨胀
    摘要:这篇文章将详细讲解图像形态学知识,主要介绍图像腐蚀处理和膨胀处理。本文分享自华为云社区《[Python从零到壹]四十七.图像增强及运算篇之腐蚀和膨胀详解》,作者:eastmount。一.形态学理论知识数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并出去不相干的结构。......
  • 微服务框架SpringCloud-2-服务拆分及远程调用-2.2服务远程调用
    微服务框架SpringCloud2服务拆分及远程调用2.2服务远程调用2.2.1根据订单id查询订单功能需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回现在是不能做到的, 可以看到现在user是个null【所以没有达到需求】现在的情况是下面的样子  但是需求想要的......