一个比较明显的OOM的排查过程

本文涉及的产品
性能测试 PTS,5000VUM额度
简介:

淘江湖由于之前遇到过因爬虫导致对用户中心的访问飚高而险些发生问题的情况,所以在其最近的一个项目中升级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) = 1541000 enter
com.alibaba.webx.filter.timer.TimerFilter.doFilter(TimerFilter.java:97) = 1 enter
com.taobao.matrix.center.interceptor.ProfilerInterceptor.invoke(ProfilerInterceptor.java:17) = 1541000 release

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

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

本文来源于"阿里中间件团队播客",原文发表时间"  2011-03-08"

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
缓存 Java Android开发
【OOM异常排查经验】
【OOM异常排查经验】
217 0
|
运维 监控 Java
内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)
全网最全的内存溢出CPU占用过高排查文章,包含:问题出现现象+临时解决方案+复现问题+定位问题发生原因+优化代码+优化后进行压测,上线+复盘
2355 5
|
3月前
|
存储 监控 Java
线上OOM排查
本文介绍了JDK工具的使用方法及其应用场景。首先详细说明了`jps`、`jstack`、`jstat`和`jmap`等工具的基本用法及参数含义,帮助开发者实时监控Java进程的状态,诊断线程问题及内存使用情况。接着介绍了`jvisualvm.exe`和`MemoryAnalyzer.exe`两款内存诊断工具,展示了如何通过这些工具进行内存分析。最后,文章提供了在线上OOM故障排查的具体步骤,并给出了解决方案示例,以便开发者更好地理解和解决实际问题。
线上OOM排查
|
监控 Java
jvm异常排查
jvm异常排查
52 0
|
消息中间件 存储 缓存
【10个OOM异常的场景以及对应的排查经验】
【10个OOM异常的场景以及对应的排查经验】
218 0
|
监控 Python
系统中出现僵尸进程排查过程
记一次僵尸进程过多的排查过程
646 0
|
Java
OOM排查小案例
写作目的 排查过某OOM问题吗?额。。。没有
203 0
OOM排查小案例
|
Arthas Java 测试技术
发生OOM了,你知道是什么原因吗,又该怎么解决呢?
总结常见的OOM的原因以及解决方案。
714 0
|
存储 SQL Java
线上又 OOM 了 ,教你快速定位问题~
线上又 OOM 了 ,教你快速定位问题~
线上又 OOM 了 ,教你快速定位问题~