近来在负责公司短信网关的维护及建设,随着公司业务发展对短信依赖越来越严重了,短信每天发送量也比曾经每天40多w发送量暴增到每天达到200w发送量。由于是採用Java做发送底层,压力递增情况下不可避免的面对内存问题。

在发送量接近200w情况下,出现内存泄露问题了。

经过对系统执行检查发现:

1)每次重新启动系统3-4个小时后。均发现一点不稳定;

2)在3-4个小时后。出现out of memory的错误:java.lang.OutOfMemoryError: GC overhead limit exceeded

发现这个问题后,直接通过JMS获取监控日志,发现系统的内存回收存在异常,gc压力很大并且存在明显内存积压。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXJqaWNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

然后直接把系统的内存down下来分析,发现的确存在内存积压情况:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXJqaWNr/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这个是mysql的一个定时任务的,这个定时任务主要作用是在用于做查询超时的。

简单举个样例,系统在运行一个sql查询情况下。jdbc会给你一个超时时间。为了保证超时时间后,能够关闭statement,会打开一个保护关闭的定时任务。假设超时情况下,sql还没响应运行,cancel
task就会运行关闭任务。由于c3p0的默认设置的超时时间为25s(<setting name="defaultStatementTimeout" value="25000" />),意味这个25s内,在运行大量sql情况下。cancel task积压到了一定程度,就会造成系统不稳定。

(最后发现这个并非根本原因,仅仅是表象)

可是系统本身就有通过mysql做发送队列的,本身对mysql操作许多。假设仅仅是对代码层面下优化基本杯水车薪。

在时间紧迫的情况下。短时间内稳定业务才是最重要的任务。

被逼依据以上现状採用了暂时方案解决。



暂时方案

通过以上推断,基本能够判定cancel task在某组线程执行应该会形成一个峰值,撑爆了JVM的堆。可是如今无法在停止业务执行做过多调试,所以当机立断,对JVM的内存扩大一倍以上,希望系统能够跨过一波内存峰值。结果把JVM的内存调整为故障时候的2倍时候,系统的内存又恢复到正常运作。只是cancel task最高值会占用到内存2G以上。尽管也是会回收,可是一直扩内存不是非常好的办法。

解决方式

系统採用的mysql jdbc 5.1.6的版本号,立马反编译mysql代码,发现下面问题。

由于cancel task的timer在connection中静态存放。意味statement假设正常查询出结构,业务无法把cancel task内存回收才是故障根本原因。

明白问题在mysql jdbc上面后。根本解决的方法应该查询mysql jdbc是否攻克了这个bug。

在5.1.11版本号中找到这个bug的修复。更新后。内存泄漏故障得到解决。http://dev.mysql.com/doc/relnotes/connector-j/en/news-5-1-11.html

讨论并协助谢国波感和锐利康。使故障得以圆满解决!

上Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题和解决方法的更多相关文章

  1. Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  2. 使用HandyJSON导致的内存泄漏问题相关解决方法

    在移动开发中,与服务器打交道是不可避免的,从服务器拿到的接口数据最终都会被我们解析成模型,现在比较常见的数据传输格式是json格式,对json格式的解析可以使用原生的解析方式,也可以使用第三方的,我们 ...

  3. MFC多线程内存泄漏问题&amp;解决方法

    在用visual studio进行界面编程时(如MFC),前台UI我们能够通过MFC的消息循环机制实现.而对于后台的数据处理.我们可能会用到多线程来处理. 那么对于大多数人(尤其是我这样的菜鸟),一个 ...

  4. 同一台机器上多个tomcat启动造成的内存溢出问题的解决方法。

    加下面这句话就行了,我是WIN10+双tomcat+nginx(本地站点),无压力.在编译器的vm option里面加哦. -server -Xms512m -Xmx1024m -XX:PermSiz ...

  5. 【small项目】MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:

    MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...

  6. golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法

    golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法,查询中报了以下这个错 Scan error on column index 2: ...

  7. mysql left join 右表数据不唯一的情况解决方法

    mysql left join 右表数据不唯一的情况解决方法 <pre>member 表id username1 fdipzone2 terry member_login_log 表id ...

  8. Linux系统内存占用90%以上——解决方法

    Linux系统内存占用90%以上--解决方法   首先要明确一个问题:Linux系统内存占用90%以上,是否属于正常范围?网上有详细的解释,这属于正常现象~~~    www.2cto.com   L ...

  9. Android开发 |常见的内存泄漏问题及解决办法

    在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要 ...

随机推荐

  1. ASP.NET程序发布流程

    1.在要发布的项目上 右键->发布,如下图所示 “目标位置”选择要发布到的本地目录,点击“发布” 2.打开IIS,在右键“网站”,选择“添加网站”,出现如下所示的对话框 在“网站名称”处添加一个 ...

  2. 我的EJB学习历程

    http://blog.csdn.net/sinapaper/archive/2004/06/28/28659.aspx http://blog.csdn.net/sinapaper/archive/ ...

  3. 中国科学院信息project研究所 第四研究室实习生/应届生招聘

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2hpWmhpeGlu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  4. TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现

    题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...

  5. SRM 219 Div II Level One: WaiterTipping,小心约分

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12609&rd=15503 这题目看上去so easy, ...

  6. namespace命名空间

    在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的.可以将 PHP 命名空间与文件系统作一个简单的类比.在文件系统中访问一个文件有三种方式: 相对文件名形式如foo ...

  7. JVM指令集(指令码、助记符、功能描述)(转)

    JVM指令集(指令码.助记符.功能描述) 指令码 助记符 功能描述 0x00 nop 无操作 0x01 aconst_null 指令格式:  aconst_null 功能描述:  null进栈. 指令 ...

  8. CF 460C Present 【DP+】主意

    给你n高树花.m日,每天连续浇筑w鲜花.一天一次,花长1高度单位 求m天后.最矮的花最高是多少 最大最小问题能够用二分来解 首先我们能够得到全部花的最矮高度即答案的下界,给这个花浇m天即是答案的上界 ...

  9. 3 分钟的高速体验 Apache Spark SQL

    "War of the Hadoop SQL engines. And the winner is -?" 这是一个非常好的问题.只要.无论答案是什么.我们都值花一点时间找出 Sp ...

  10. 编写高效的JavaScript

    Web前端性能优化——编写高效的JavaScript   前言 随着计算机的发展,Web富应用时代的到来,Web 2.0早已不再是用div+css高质量还原设计的时代.自Gmail网页版邮件服务的问世 ...