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

news/2024/7/19 11:37:47 标签: java, 面试, 爬虫

淘江湖由于之前遇到过因爬虫导致对用户中心的访问飚高而险些发生问题的情况,所以在其最近的一个项目中升级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"


http://www.niftyadmin.cn/n/841045.html

相关文章

mybatis基础犯错总结

1、关于mybatis的文件一般都是其mapper文件出错: 首先关于输入参数parameterType出错: (1)基本数据类型:如果输入参数只有一个,其数据类型可以是基本数据类型,也可以是自己定的类型:…

《SolidWorks 2014中文版完全自学手册》——导读

**前言**SolidWorks是由著名的三维CAD软件开发供应商SolidWorks公司发布的三维机械设计软件,可以最大限度地释放机械、模具、消费品设计师们的创造力,使他们只需花费同类软件所需时间的一小部分即可设计出更好、更有吸引力、更有创新力、在市场上更受欢迎…

DHT11传感器的学习使用

相比于DS18B20只能测温度,DHT11能测温度之外还能测湿度,但是DHT11的精度和测量范围都要低于DS18B20 目录DHT11简介DHT11封装与引脚说明DHT11工作原理 数据格式 工作时序 注意事项 分辨0和1的方法自己写的驱动程序(C51)DHT11简…

Laravel 视图中AJAX请求、jquery-ujs异步使用DELETE请求时配置X-CSRF-TOKEN

2019独角兽企业重金招聘Python工程师标准>>> 常规在form表单中配置token方式 {!! csrf_field() !!}Or<input type"hidden" name"_token" value"<?php echo csrf_token(); ?>">Or<?php echo csrf_field(); ?> A…

ROM 、RAM和FLASH 的区别

本文转载自laibour的博文地址&#xff1a;http://blog.sina.cn/dpool/blog/s/blog_4b37304d0100fg10.html?vt4ROM和RAM指的都是半导体存储器&#xff0c;ROM是Read Only Memory的缩写&#xff0c;RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据&a…

SSD1306 OLED驱动芯片 详细介绍

SSD1306是一款OLED驱动芯片&#xff0c;拥有最大128*64像素支持&#xff0c;广泛应用在小尺寸OLED显示屏的驱动中。SSD1306使用介绍简介 器件特性SSD1306结构介绍 内部结构图 引脚分配图 引脚说明其他引脚&#xff1a;电源引脚&#xff1a;驱动器输出引脚&#xff1a;MCU接…

《深入理解Spark:核心思想与源码分析》——第2章Spark设计理念与基本架构

本节书摘来自华章社区《深入理解Spark:核心思想与源码分析》一书中的第2章Spark设计理念与基本架构&#xff0c;作者耿嘉安&#xff0c;更多章节内容可以访问云栖社区“华章社区”公众号查看 第2章Spark设计理念与基本架构若夫乘天地之正&#xff0c;而御六气之辩&#xff0c;以…

我最终让我的OLED刷新速度跟老师的一样快

我最终让我的OLED刷新速度跟老师的一样快事情发生在今年的暑假&#xff0c;我的学校举办了两个短学期用来提高我们的专业实践水平&#xff0c;其中一个是做嵌入式开发。内容是结合OLED&#xff0c;ESP8266和MPU6050做一个多级菜单的物联网嵌入式系统设计&#xff0c;使用STM32F…