我们的一个服务器软件在线上环境运行时出现了内存缓慢增长的问题。
用valgrind测试
MySQL的C客户端mysqlclient发现,它在正常的使用中会被valgrind报出存在内存泄漏。
1 正常使用场景
下面的代码是使用mysqlclient读取数据的最常用的代码
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
上面的代码用valgrind检测内存泄漏输出如下:
?
|
可以看出,在正常的使用场景下,mysqlclient有一部分内存在 mysql_close()
之后并没有被释放。
2 解决方法
stackoverflow上的一篇文章提出了解决方法:在 mysql_close()
之后调用 mysql_library_end()
来释放
剩余的内存空间 MySQL开发手册对 mysql_library_end()
的描述如下:
?
|
3 效果检验
在上面的示例代码中加入 mysql_library_end()
函数:
?
1 2 3 4 5 |
|
然后用valgrind检测内存泄漏:
?
|
可以看出,已经没有未释放的内存了。
所以对于daemon进程,如果频繁地调用 mysql_init
和 mysql_close
的话,记得在 mysql_close
之后调用 mysql_library_end()
来释放未被释放的内存
Author: CobbLiu <[email protected]>
Date: 2014-05-05 13:42:21 CST
HTML generated by org-mode 6.33x in emacs 23