调用阿里云OSS未释放资源造成的内存溢出

Posted jasonchai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用阿里云OSS未释放资源造成的内存溢出相关的知识,希望对你有一定的参考价值。

 

前段时间线上服务频繁出现内存溢出的问题,有时候半夜就会挂掉,运维同事还得从睡梦中爬起来重启,给我们带来很大的困扰。一次运维同事在快到挂掉前把jvm 的heap dump拿了下来给了我们,通过内存分析工具 MemoryAnalyzer 打开看到结果如下

技术图片

 

可以看到有大量的org.apache.http.impl.conn.PoolingHttpClientConnectionManager 对象未被释放 ,并且可以看到是 阿里云的 oss 在引用的,灵机一动,可能是访问oss服务的时候某些资源没被释放,

但是oss的类库是公司的另一部门封装的,我们产品是直接拿来用的,那就去看看他们的源码吧。

经过查看源码发现,在每一次的oss请求都会创建一个阿里云的 OSSClient实例 ,在调用ossClient接口请求完之后并没有调用OSSClient的shutdown()方法释放资源。怪不得运行几天后内存过高不行的fullGC 直至内存溢出。反馈给另一部门之后改完我们重新打包发版,

运行观察了一段时间,再没有出现内存溢出了。真好。

 

以上是关于调用阿里云OSS未释放资源造成的内存溢出的主要内容,如果未能解决你的问题,请参考以下文章

用阿里云CDN加速OSS源站的方法步骤

用阿里云CDN加速OSS源站的方法步骤

[实战]生产环境阿里云-OSS资源迁移

Java调用阿里云oss下载文件

Java调用阿里云oss下载文件

Java调用阿里云oss下载文件