GC问题定位——内存耗尽,young GC频繁

GC问题定位——内存泄漏,young GC频繁

问题描述

这件事情发生在“购物车”的上游系统——“价格”,2019年8月21晚发布了一个并发的工作单,发布后发现服务器CPU和内存被撑爆,且频繁发生young GC

问题定位

  1. 首先确定机器JDK版本——JDK7,这个版本PermGen还没有被MetaSpace取代
  2. 然后确定机器GC收集器——G1,可以以可控制的停顿时间工作,同时作用于新生代和老年代
  3. 检查JVM参数,发现堆大小、新生代比例、对象年龄阈值都合理
  4. 分析GC日志,发现full GC频率在个位数,属于正常水平;GC中99%是young GC,且频率十分高,在短短几小时内发生了数万次
  5. 到了这一步,问题已经定位了,频繁的young GC一定是因为对象的创建过快,导致回收不及 —— 分析堆dump日志,发现重复对象90%是一个读取远程全局配置的对象(你可以理解为Spring Cloud Config Client
  6. 检查代码和远程配置后发现,是它们远程配置少了几个配置项,同时远程配置系统采用的是一旦失败就不断重试的方法(会创建新的对象来建立连接,加入一个LinkedBlockingQueue的无界队列中),当天任务的并发量很高,所有任务不断地创建对象来读取远程配置,然后一直失败,最终导致了新建对象过多,来不及回收,最终撑爆了内存。
-------------本文结束感谢您的阅读-------------

本文标题:GC问题定位——内存耗尽,young GC频繁

文章作者:DragonBaby308

发布时间:2019年08月23日 - 22:09

最后更新:2019年09月22日 - 10:14

原始链接:http://www.dragonbaby308.com/Strange-young-GC-20190823/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%