Bendi新闻
>
一次由于八股文引起的内存泄漏
一次由于八股文引起的内存泄漏
阿里妹导读
一、第一次报错系统监控现象
14:16 机器发布新代码 15:35 机器开始出现fullGC 15:50 机器fullGC耗时上升 17:48 对JVM进行dump操作,然后进行机器置换
1.有大量阻塞线程
1.1 排查过程
分析线程Dump文件
1.2 分析原因
public class OssClient implements BeanPostProcessor {
private OSS ossClient = null;
/**
* 初始化OSS客户端
**/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 省略代码……
// 以下是阻塞代码行
ossClient = new OSSClientBuilder().build(ossProperty.getString("endpoint"),
ossProperty.getString("accessKeyId"),
ossProperty.getString("accessKeySecret"),
configuration);
// 省略代码……
return bean;
}
}
1.3 第一次问题解决
二、第二次报错系统监控现象
19:48 机器发布新代码 22:30 机器开始出现fullGC 23:30 机器fullGC耗时上升 00:30 对JVM进行dump操作,然后进行机器置换
2.1 排查过程
分析线程Dump文件
1.阻塞线程确实是由于OSS跨单元拒绝访问导致的
分析GC Dump文件
这里显示有11万个org.apache.http.impl.conn.PoolingHttpClientConnectionManager实例,占用了80.42%的堆内存,但是这个类并不是我直接引入的,那么一定是有间接依赖,生成了大量该类对象。
另外,通过类名,能判断这个对象是和网络请求有关系,而我这个应用上需要网络请求的地方有几处: 1.访问DB 2.访问Redis 3.访问OSS 4.进行HSF调用
2.2 分析原因
public class OssClient implements BeanPostProcessor {
private OSS ossClient = null;
/**
* 初始化OSS客户端
**/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 省略代码……
// 一下是阻塞代码行
ossClient = new OSSClientBuilder().build(ossProperty.getString("endpoint"),
ossProperty.getString("accessKeyId"),
ossProperty.getString("accessKeySecret"),
configuration);
// 省略代码……
return bean;
}
}
排查原因过程中,有一篇文章给了我答案,下面是这篇文章给的OOM原因的解释:
每次new OSSClient的时候,都会往List中放入HttpClientConnectionManager,但是没有主动调用OSSClient的shutdown的方法,所以List只会增大不会变小。反观我们的代码,每次接口调用都会创建一个OSSClient对象,但却在使用完之后,没有调用OSSClient的shutdown方法,导致未调用IdleConnectionReaper的removeConnectionManager方法,使得IdleConnectionReaper中静态列表存储的PoolingHttpClientConnectionManager实例数据一直会增长,一直都不会被回收,最终带来的结果就是OOM。
2.3 最终问题解决
public class OssClient implements InitializingBean {
private OSS ossClient = null;
/**
* 初始化OSS客户端
**/
public void afterPropertiesSet() throws Exception {
// 省略代码……
// 以下是阻塞代码行
ossClient = new OSSClientBuilder().build(ossProperty.getString("endpoint"),
ossProperty.getString("accessKeyId"),
ossProperty.getString("accessKeySecret"),
configuration);
// 省略代码……
}
}
总结
微信扫码关注该文公众号作者
来源:阿里云开发者
相关新闻
记一次疑似JVM内存泄漏的排查过程记一次hosts配置内容过多引起的故障凯特王妃曾递小纸条求救?!网友挖出其最后一次出现时的细节!伦敦煤气泄漏致数千人撤离......抄底时刻!一年一次的年中大福利,大额优惠券仅剩一天,Costco直邮到家,方便省钱!早于美国!全球首个每周注射一次的胰岛素在中国获批视频号暂停这类用户直播准入资格;完美世界裁员?最新回应;全球首个每周注射一次的胰岛素在中国获批|大公司动态人生必去一次的敦煌,还可以怎么看?维多利亚的秘密半年一次的促销:最高60%折扣!@ Victoria's Secret618!抄底时刻!一年一次的年中大福利,今日又有新开了,Costco直邮到家!糖尿病福音!全球首款每周注射一次的胰岛素将在加拿大上市张雪峰最良心的一次建议,靠谱吗?首发|每个人一生中都要来一次的地方,读过它才不白来!十多年来最重要的一次!库克会暗掷“王炸”吗?高善文:这一次的救助找到了病根,或将推动房地产市场触底反转高善文今天发声:这一次的救助找到了病根,或将推动房地产市场触底反转,中国长期资本回报率的下行,带动利率中枢的持续下行吓人! 专家警告加拿大生活水平将暴跌至40年来最低点! 持续下降幅度最长的一次!吓人! 专家警告加国生活水平将暴跌至40年来最低点! 持续下降幅度最长的一次!这是内娱发挥最稳定的一次了吧每年仅一次的薅羊毛庆祝大会,不会还有人不知道吧?!麻醉医生的一次住院手术经历重磅!澳洲内政部表示:打工度假签将对中国申请人重新开放!一生只有一次的机会...一年一次的六一,我们花了2个月挑的礼物清单,闭眼入给孩子惊喜!旅游|洛杉矶-纽约 | 12天陆路跨越美国之旅,此生定要尝试一次的难忘壮举~5月16日仅此一团!手慢无!聊一聊:你最成功的一次跟风是啥?