淘江湖由于之前遇到过因爬虫导致对用户中心的访问飚高而险些发生问题的情况,所以在其最近的一个项目中升级TDDL到2.4.4版本,以使用tddl的流控功能。但是在一次压测6个小时后产生了OOM异常。用晓锋的TProfiler分析结果是:

num #instances #bytes class name
———————————————-
1: 880137 104619672 char[]
914733 21953592 | +–java.lang.String
774175 37160400 | | +–com.********Profiler$Entry
790764 31074808 | | | +–java.lang.Object[]
781966 18767184 | | | | |–java.util.ArrayList
…
790764 31074808 | | +–java.lang.Object[]
781966 18767184 | | | +–java.util.ArrayList
774175 37160400 | | | | |–com.********Profiler$Entry
…

直接用jmap-histo查看结果是:

num #instances #bytes class name
———————————————-
1: 4542494 544227352 [C
2: 4429530 212617440 com.********Profiler$Entry
3: 4451761 165336648 [Ljava.lang.Object;
4: 4577468 109859232 java.lang.String
5: 4439023 106536552 java.util.ArrayList
6: 18058 24432336 [I
…

步认为是com.**.Profiler没有release造成的问题,但是业务方的代码只有两行调用了Profiler,
包括其引用的jar包的代码中也没有发现忘记release的地方。
再用Mat分析过dump文件,一个线程引用了490多M的对象,Profiler$Entry本身占了92M的内存,但是占用了480M空间,
因此确定无疑是Profiler没有release造成的,所以写了一个BTrace脚本跟踪Profiler的enter和release调用,结果如下
com.taobao.matrix.center.interceptor.ProfilerInterceptor.invoke(ProfilerInterceptor.java:14)=1541000enter
com.alibaba.webx.filter.timer.TimerFilter.doFilter(TimerFilter.java:97)=1enter
com.taobao.matrix.center.interceptor.ProfilerInterceptor.invoke(ProfilerInterceptor.java:17)=1541000release

询问淘江湖的压测方法,是发了一个http请求后触发服务端开启线程池压测,直到压测完http请求才返回。因此在整个过程中
com.*.filter.*.XXFilter.doFilter(XXFilter.java:97)调用Profiler.enter之后都没有立即释放。
com.**.Profiler使用ThreadLocal保存跟踪信息的,多线程情况下本来也不会有问题,
但碰巧线程池用的reject策略是CallerRun,而其并发量非常大,这样每次callerrun时进入的entry都不会释放,直到最后OOM

修改压测代码,让http请求立即返回后服务端再开始压测,问题解决

转载于:https://blog.51cto.com/aliapp/1327683

一个比较明显的OOM的排查过程相关推荐

  1. 记一次OOM问题排查过程

    上周运维反馈线上程序出现了OOM,程序日志中的输出为 Exception in thread "http-nio-8080-exec-1027" java.lang.OutOfMe ...

  2. 一次堆外OOM问题的排查过程

    转载自   一次堆外OOM问题的排查过程 背景 线上服务有一台机器访问不通(一个管理平台),在公司的服务治理平台上查看服务的状况是正常的,说明进程还在.进程并没有完全crash掉.去线上查看机器日志, ...

  3. 转:记一次linux oom内存溢出排查过程

    @转:记一次linux oom内存溢出排查过程 记一次linux oom内存溢出排查过程 2018年08月16日 14:13:49 enchanterblue 阅读数 4099更多 分类专栏: --- ...

  4. 一次堆外内存泄露的排查过程

    转载自  一次堆外内存泄露的排查过程 最近在做一个基于 websocket 的长连中间件,服务端使用实现了 socket.io 协议(基于websocket协议,提供长轮询降级能力) 的 netty- ...

  5. 记一次线上服务假死排查过程

    大家好,我是烤鸭: 最近线上问题有点多啊,分享一个服务假死的排查过程. 问题描述 9点10分,收到进程无响应报警(一共6台机器,有1台出现),后来又有1台出现. 排查思路 首先确认是否误报或者网络抖动 ...

  6. 记一次线上cpu飙升100%的排查过程

    大家好,我是烤鸭: 最近没怎么写技术文章,还是得回归下初心,正好前几天出现个线上问题,记录下排查过程. 问题描述 某个时间点,接收到接口响应慢报警. 过一会收到服务器cpu可用率低(<10%)报 ...

  7. 记一次SOFA内存泄漏排查过程

    记一次内存泄漏排查过程 起因 某天中午大家还在安静的午休,睡得正香的时候突然被一阵手机滴-滴滴直响短信惊醒.一看是应用的服务器告警并且对应服务的所有机器都在告警"健康检查失败,自动拉下线&q ...

  8. java gc full gc_记一次Java服务频繁Full GC的排查过程

    现象 从监控来看,堆内存是够用的,但是频繁触发Full GC,每秒钟三次,每次耗时三四秒. image.png 结合Young GC的信息和堆内存的使用情况,可以发现新生代的内存够用,老生代的内存不够 ...

  9. java cms cpu占用率_cpu使用率过高和jvm old占用过高排查过程

    今天断断续续的收到管理平台的异常报警,cpu占用过高和jvm old占用过高,这个时候赶紧去排查原因,下面记录了我的排查过程,可能里面还有不正确的地方,欢迎各位大佬指正,也欢迎大家关于类似的案例一起交 ...

最新文章

  1. NVIDIA Jetson TX2使用
  2. java实现高斯赛德尔算法解线性方程组
  3. 51单片机——My-Clock项目
  4. bigdecimal如何做除法_公务员行测朴素逻辑解题技巧—代入排除法
  5. 有问有答 | 你真的理解微服务架构吗?
  6. Python第三方库离线安装包制作(whl文件)(离线包)
  7. @apioperation 作用_蜂蜜的作用与功效
  8. xshell 无法定位输入点_linux基础知识个人总结
  9. 通过chrome console 快速获取网页连接
  10. 自己对Java的一些认识
  11. api64 gta5缺少steam_GTA5无法启动此程序,因为计算机中丢失steam_api64.dll 游戏打不来 现实这个,win7 64位....
  12. 康佳电视应用助手服务器连接超时,康佳盒子出现网络连接问题的原因,解决方式...
  13. 七种常见的数据分析法之:对比分析法
  14. QRCode简单生成二维码
  15. Android彻底解决Youtube和Google play store等套件报错崩溃的问题
  16. 卷积神经网络学习项目--Kaggle仙人掌识别--基于TensorFlow(未完成)
  17. 宽屏电脑应用不全屏显示问题
  18. AV1的CDEF过程介绍
  19. u盘怎么装电脑系统 u盘启动盘系统重装教学
  20. [Java基础]--Java GC工作原理

热门文章

  1. archsummit2017见闻和思考
  2. Tomcat工作原理
  3. easyUI的combobox是否可用
  4. GB2312、GBK与UTF-8的区别
  5. 分布式消息通信ActiveMQ原理-持久化策略-笔记
  6. ASP.NET MVC WebAPI 资源整理
  7. 初学Python(二)——数组
  8. spring 初始化数据库
  9. 记TX实习生笔试归来
  10. resin服务器配置错误