首页 > 应用开发 > Java > 一次由于八股文引起的内存泄漏
来源:阿里技术
这是2024年的第12篇文章
( 本文阅读时间:15分钟 )
01

02


14:16 机器发布新代码 15:35 机器开始出现fullGC 15:50 机器fullGC耗时上升 17:48 对JVM进行dump操作,然后进行机器置换

2.2 分析原因
@Componentpublic class OssClient implements BeanPostProcessor {private OSS ossClient = null;/** * 初始化OSS客户端 **/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 省略代码……// 以下是阻塞代码行 ossClient = new OSSClientBuilder().build(ossProperty.getString("endpoint"), ossProperty.getString("accessKeyId"), ossProperty.getString("accessKeySecret"), configuration);// 省略代码……return bean; }}
2.3 第一次问题解决
03
第二次报错系统监控现象


19:48 机器发布新代码 22:30 机器开始出现fullGC 23:30 机器fullGC耗时上升 00:30 对JVM进行dump操作,然后进行机器置换
3.1 排查过程


另外,通过类名,能判断这个对象是和网络请求有关系,而我这个应用上需要网络请求的地方有几处: 1.访问DB 2.访问Redis 3.访问OSS 4.进行HSF调用

3.2 分析原因
虽然定位到了是由于OSS建议依赖进来,但是看代码仍然不能解释为什么会产生内存泄漏。
@Componentpublic class OssClient implements BeanPostProcessor {private OSS ossClient = null;/** * 初始化OSS客户端 **/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 省略代码……// 一下是阻塞代码行 ossClient = new OSSClientBuilder().build(ossProperty.getString("endpoint"), ossProperty.getString("accessKeyId"), ossProperty.getString("accessKeySecret"), configuration);// 省略代码……return bean; }}每次new OSSClient的时候,都会往List中放入HttpClientConnectionManager,但是没有主动调用OSSClient的shutdown的方法,所以List只会增大不会变小。反观我们的代码,每次接口调用都会创建一个OSSClient对象,但却在使用完之后,没有调用OSSClient的shutdown方法,导致未调用IdleConnectionReaper的removeConnectionManager方法,使得IdleConnectionReaper中静态列表存储的PoolingHttpClientConnectionManager实例数据一直会增长,一直都不会被回收,最终带来的结果就是OOM。

3.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);// 省略代码……}}
04
总结
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024922/viewspace-3007279/ ,如需转载,请注明出处,否则将追究法律责任。