美文网首页
OssClient导致内存泄漏

OssClient导致内存泄漏

作者: kingTao_ | 来源:发表于2022-10-14 13:36 被阅读0次

图片为证

图片上为问题代码


问题代码.jpg

1.代码解读

一句话解读:通过oss sdk获取oss私有图片临时链接

2.问题发现

  • 日常巡检

    • 发现sentinel后台服务实例pod有掉线情况
    • k8s后台确认服务异常,超过设置弹性伸缩指标
  • 阿里后台

    • fullgc频繁(新服务上线后未关注)
    • cpu、负载间断升高(fullgc引起)
    • 项目重启后内存持续升高(途中几段都为重启后运行)


      阿里后台发现1.jpg
    阿里后台发现2.jpg

3.解决过程

  • 1.根据阿里后台现象判断有明显内存泄漏
  • 2.找运维同学查看jvm指标,导出dump文件
查看堆中内存占用最大的对象,同时触发手动FullGC 
jmap -histo:live <pid>|head
导出dump文件
jmap -dump:format=b,file=name.hprof <pid>
  • 3.后让运维同学重启服务并升级服务配置:1c2g->2g4G,避免短期频繁触发fullgc、触发弹性伸缩
dump文件分析

我使用的是jprofiler破解版,导入即可查看离线jvm堆栈信息

  • 1.jvm堆中实例数排序


    实例数排序.jpg
    • 开始我一直在关注这个排序结果,最多的实例为HashMap$Node,是个反射对象
    • 继续查看对象根实例,发现很凌乱,根里面什么信息都有,看不出哪里内存泄漏
    • 根据上面的结果初步判定是代码中序列化出现了内存泄漏(关注的点和判断结果导致排查方向错误)
    • 于是去排查了代码(不知道哪里的问题,尝试解决)
      • 线程池核心线程配置不符合实际
      • 发现fastjson和参考服务版本不一致,网上也有类似案例:序列化要配置,全局共享实例SerializeConfig.globalInstance
      • restTemplate未指定连接池
    • 调整线程池、升级fastjson版本、指定restTemplate连接池,处理后上线,观察后并未得到解决
    • 反查了fastjson两个版本1.2.58,1.2.62,已经默认是全局共享实例了(改这个版本实际啥用也没有)


      fastjson1.jpg
    fastjson2.jpg

    - ======================================================
    - 前面所有尝试无效后,又去查代码,发现可疑代码片段(见开头)
    - 经过优化ossclient为单例、测试,初步定位就是oss连接无限创建,没有关闭导致的内存泄漏


    优化代码.jpg

    - 引发了疑问:jprofiler为啥看不出是http连接池问题导致内存泄漏?下图是找同事eclipse MAT分析查看结果:直接指出了问题所在


    eclipse1.jpg eclipse2.jpg
  • 2.jvm堆中保留对象排序


    保留对象排序.jpg
传入引用gc根.jpg 祸根.jpg
  • jprofiler点击【保留大小】排序,其实也很容易发现问题,常见对象一般先忽略,可见异常对象:PoolingHttpClientConnectionManager
  • 点击【显示到GC根的路径】,PoolingHttpClientConnectionManager整个大对象被一个数组对象引用着的,根路径为:com.aliyun.oss.common.comm.IdleConnectionReaper
  • IdleConnectionReaper里面有个【静态数组】对象,就是用来放连接对象的,问题代码刚好未关闭连接,导致无限增长

4.总结

  • 1.内存泄漏本身不是特别难处理的问题,解决过程一般来说都是固定程序(当然,也会遇到排除特别难发现的)
  • 2.熟悉相关分析工具能事半功倍,案例中我就是因为不熟悉工具导致盲目尝试过,但是盲目过程中也优化了部分代码

5.思考

本次内存泄漏是ossclient连接无限创建并未关闭导致,为什么从jprofiler看HashMap$Node实列数非常大?

相关文章

  • OssClient导致内存泄漏

    图片为证 图片上为问题代码 1.代码解读 一句话解读:通过oss sdk获取oss私有图片临时链接 2.问题发现 ...

  • Android内存优化——常见内存泄露及优化方案

    内存泄漏情况分类 1、单例模式导致内存泄漏 2、静态变量导致内存泄漏 3、非静态内部类导致的内存泄漏 4、未取消注...

  • Android常见内存泄漏汇总

    目录:一、内存泄漏介绍二、常见内存泄漏场景1.单例导致内存泄露2.静态变量导致内存泄漏3.非静态内部类导致内存泄露...

  • TextView 富文本学习六 - 设置了ClickableSp

    1 设置ClickableSpan导致内存泄漏 导致内存泄漏的原因:https://stackoverflow.c...

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • android 内存性能

    handle引起的内存泄漏 强引用资源引起的内存泄漏 线程导致的内存泄漏 系统学习安卓内存泄露 large hea...

  • 动态分配内存的危险(浅)

    1、内存泄漏。原因:代码中的错误导致。2、内存碎片。原因:动态分配内存时内存使用不当导致的。 内存泄漏:使用new...

  • 谈谈 LeakCanary 原理 --标准答案

    内存泄漏传统意义上的内存泄漏是至忘记手动释放内存,导致未释放的内存不可使用的现象。 jvm 的内存泄漏jvm的内存...

  • Android内存优化—内存优化总结

    内存问题 内存抖动:导致GC导致卡顿 内存泄漏:导致频繁GC,可用内存减少 内存溢出:导致OOM 工具排查 AS中...

  • iOS 内存泄漏

    内存泄漏是由对象使用内存,但却没让系统回收内存而导致的。如果不检查这种情况,内存泄漏就会导致应用变慢或者崩溃。 原...

网友评论

      本文标题:OssClient导致内存泄漏

      本文链接:https://www.haomeiwen.com/subject/edwqzrtx.html