生产应用频繁fullgc分析
应用 分析 生产 频繁 fullgc
2023-06-13 09:11:39 时间
生产有应用频繁的fullgc,怀疑系统存在异常。
jvm参数配置
首先介绍下系统的jvm参数配置:
老年代CMS收集器
堆大小4G 年轻代2G 老年代2G 元空间256M
S0:S1:Eden=1:1:8,Eden=2G*0.8=1.6G
CMS GC阈值是70%,即2G*0.7=1.4G
也就是老年代达到1.4G时,年轻代满的话再往老年代晋升对象的时候,会发生FGC
年轻代默认晋升年龄是15次
再来温故下堆内存空间结构:
分析
接下来,dump内存,这里注意一点,dump时切记让运维同学把dump的机器从集群中摘掉,否则dump时会造成JVM线程停顿,导致超时告警,影响业务。dump结果使用MAT(Eclipse Memory Analyzer)分析,具体截图就不展示了,从支配树上可以看出,某个缓存对象占用空间很大,个数非常多。从业务代码中查看,发现该对象是个本地缓存对象(Guava Cache),缓存3分钟,而且是个配置项,按照不同业务线、城市,总共才500个,每个配置项比较小,怎么会突然占用这么大空间呢?使用jstat命令查看系统的垃圾回收统计情况,发现YGC大概每10s一次,对于一个对象,即在年轻代中驻留约15*10=150s,再晋升到老年代,也就是在缓存有效期内,缓存对象足够晋升到老年代,缓存失效时,则会创新创建对象放入缓存。初步结论是:缓存过期时间过小导致对象晋升到老年代过快。
解决
根据该业务场景,设置缓存永不过期。
结论
在使用本地缓存时,一定要注意缓存时间设置,否则会导致对象晋升到老年代过快而频繁导致FGC,根据实际的业务场景需要,可以把缓存设置永不过期(缓存的更新可以用定时任务去更新或者配置变更时通过消息方式去更新本地缓存),或者过期时间设大些。
https://lioswong.github.io/2021/06/14/%E7%94%9F%E4%BA%A7%E5%BA%94%E7%94%A8%E9%A2%91%E7%B9%81fullgc%E5%88%86%E6%9E%90/
相关文章
- 应用高可靠助力企业运维
- 移动应用架构治理初探:从依赖分析与 Android 应用的生命周期说起
- 10.24VR行业大事件:App Lab应用数量飙升至1457款,是Quest主商店的三倍多
- 虚拟现实技术成功应用案例分析_虚拟现实技术的案例
- 基于Docker构建CentOS7_Java8_Tomcat8.5 的镜像及Web应用的部署
- Linux应用开发【第十六章】MQTT协议分析应用开发
- ps cs5蒙版教程-Photoshop_CS5初学者必读(10)——蒙版应用技巧
- 【DSP视频教程】第11期:插补算法,曲线拟合丝滑顺畅,统计函数和基础函数加速实现,汇集SIMD,饱和和MAC乘累加应用实战(2023-02-12)
- 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )
- 【Android 文件管理】应用可访问的存储空间 ( 存储空间分类 | 存储空间访问权限 | 分区存储 )
- 用哪种语言写的应用漏洞最严重?六大主流语言代码漏洞分析报告出炉
- 供应商SRM系统在家用电器行业的应用分析
- 让MySQL数据库更有效率:多个索引的应用(mysql多个索引)
- Oracle函数LEN的应用与分析(oraclelen)
- Oracle 触发器:不同类型的功能与应用(oracle触发器类型)
- 多云融合和安全集成推动 SD-WAN 的大规模应用
- hbase和mysql的比较:优缺点与应用场景(hbase与mysql)
- MySQLHTTP:构建强大的Web应用(mysql http)
- idOracle中的RowID解读与应用(oracle中的row)
- Redis项目应用分析(redis项目使用情况)
- 些场景下使用分析Redis队列场景应用研究(redis队列在哪)
- Wine 6.15 发布,Windows 应用的兼容层