我们的一个服务器软件在线上环境运行时出现了内存缓慢增长的问题。

用valgrind测试 MySQL的C客户端mysqlclient发现,它在正常的使用中会被valgrind报出存在内存泄漏。

1 正常使用场景

下面的代码是使用mysqlclient读取数据的最常用的代码

#include <mysql/mysql.h>
#include <stdio.h>int main()
{MYSQL       *conn;MYSQL_RES   *result;MYSQL_ROW    row;char        *w;conn = mysql_init(NULL);mysql_real_connect(conn, "127.0.0.1", "root", "", "db_test", 3306, NULL, 0);mysql_query(conn, "select id from test");result = mysql_store_result(conn);if (result == NULL) {printf("%d:%s\n", mysql_errno(conn), mysql_error(conn));goto out;}while ((row = mysql_fetch_row(result))) {w = row[0];}out:mysql_free_result(result);mysql_close(conn);mysql_library_end();return 0;
}

   

上面的代码用valgrind检测内存泄漏输出如下:

cobbliu@ubuntu:~/dev/test$ gcc -o mysql mysql.c -lmysqlclient
cobbliu@ubuntu:~/dev/test$ valgrind --leak-check=full --show-reachable=yes ./mysql
==4497== Memcheck, a memory error detector
==4497== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==4497== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==4497== Command: ./mysql
==4497==
==4497==
==4497== HEAP SUMMARY:
==4497==     in use at exit: 73,872 bytes in 21 blocks
==4497==   total heap usage: 84 allocs, 63 frees, 128,626 bytes allocated
==4497==
#
#        这儿忽略了一部分输出
#
==4497== LEAK SUMMARY:
==4497==    definitely lost: 0 bytes in 0 blocks
==4497==    indirectly lost: 0 bytes in 0 blocks
==4497==      possibly lost: 0 bytes in 0 blocks
==4497==    still reachable: 73,872 bytes in 21 blocks
==4497==         suppressed: 0 bytes in 0 blocks
==4497==
==4497== For counts of detected and suppressed errors, rerun with: -v
==4497== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

  可以看出,在正常的使用场景下,mysqlclient有一部分内存在 mysql_close() 之后并没有被释放。

2 解决方法

stackoverflow上的一篇文章提出了解决方法:在 mysql_close() 之后调用 mysql_library_end() 来释放 剩余的内存空间 MySQL开发手册对 mysql_library_end() 的描述如下:

This function finalizes the MySQL library.
Call it when you are done using the library (for example, after disconnecting from the server).
The action taken by the call depends on whether your application is linked to the MySQL client library or the MySQL embedded server library.
For a client program linked against the libmysqlclient library by using the -lmysqlclient flag, mysql_library_end() performs some memory management to clean up.

  

3效果检验

在上面的示例代码中加入 mysql_library_end() 函数:

//codes mysql_free_result(result);mysql_close(conn); mysql_library_end();
// codes

  然后用valgrind检测内存泄漏:

cobbliu@ubuntu:~/dev/test$ valgrind --leak-check=full --show-reachable=yes ./mysql
==4513== Memcheck, a memory error detector
==4513== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==4513== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==4513== Command: ./mysql
==4513==
==4513==
==4513== HEAP SUMMARY:
==4513==     in use at exit: 0 bytes in 0 blocks
==4513==   total heap usage: 84 allocs, 84 frees, 128,626 bytes allocated
==4513==
==4513== All heap blocks were freed -- no leaks are possible
==4513==
==4513== For counts of detected and suppressed errors, rerun with: -v
==4513== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

  可以看出,已经没有未释放的内存了。

所以对于daemon进程,如果频繁地调用 mysql_init  mysql_close 的话,记得在 mysql_close 之后调用 mysql_library_end() 来释放未被释放的内存

Author: CobbLiu <cobblau@gmail.com>

Date: 2014-05-05 13:42:21 CST

HTML generated by org-mode 6.33x in emacs 23

MySQL C 客户端的内存泄漏问题相关推荐

  1. MySQL案例-多源复制引起的内存泄漏

    -------------------------------------------------------------------------------------------------正文- ...

  2. mysql c接口内存泄漏_MySQL C ++连接器内存泄漏

    我确实一直在浏览类似的帖子,但是找不到适合我的问题的任何东西. 我正在尝试制作一个基本程序,用MySQL数据库进行查询,而且一切正常,但是我有很多内存泄漏. #include #include int ...

  3. 一文带你走进C++【内存泄漏】

    背景 ​没想到项目放到线上后,随着请求量的增多,却感觉到首屏速度越来越慢,并且是在持续性地变慢.而且在发布完后(也就是容器重建了),耗时又陡然降下来了. ​因此很合理地怀疑是内存泄漏了.故而在 STK ...

  4. JVM——内存泄漏与内存溢出

    内存泄漏与内存溢出 1. 面试题 什么是内存泄漏和什么是内存溢出 (陌陌) Java存在内存泄漏吗,内存泄漏的场景有哪些,如何避免(百度) Java 中会存在内存泄漏吗,简述一下?(猎聘) 内存泄漏是 ...

  5. 内存泄漏的8种情况(附代码示例)

    一. 内存泄漏(memroy leak)         严格来说,只有对象不会再被程序用到了,但是GC又不能回收它们的情况,才叫内存泄漏         宽泛的讲,实际情况中很多时候一些不太好的实践 ...

  6. Java 堆内存泄漏分析的一个例子

    Java 程序开发者,多多少少都遇到过 Java 堆内存溢出的错误,错误发生时可以在日志文件中看到 java.lang.OutOfMemoryError: Java heap space 字样.不像  ...

  7. 内存泄漏和内存溢出的关系和区别

    作者:不怕天黑_0819 链接:https://www.jianshu.com/p/61d34df7eabe 一.内存泄漏(memory leak) 1.内存泄漏是指程序中已动态分配的堆内存由于某种原 ...

  8. VC使用CRT调试功能来检测内存泄漏

    信息来源:csdn      C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证 ...

  9. linux c 内存泄漏调试工具 《valgrind用户手册》 2. 使用和理解Valgrind核心

    valgrind 用户手册原版地址:https://valgrind.org/docs/manual/manual.html 此原文地址:https://valgrind.org/docs/manua ...

最新文章

  1. 一颗ARM架构芯片的软硬件构成
  2. vue 实例数据绑定 指令 事件
  3. 物理专线流量平滑切换
  4. Nancy跨平台开发总结(三)发布到Jexus Web服务器
  5. 这些学霸的作息表“曝光”,太震撼了,快来找差距!
  6. python连接mongo_使用简单的Python连接访问MongoDB
  7. 近期 AI 领域,招聘招生信息汇总
  8. Android开发中的正在加载动画效果
  9. 【转】一些 SQLite技巧
  10. 02、差分特性阻抗仿真
  11. 永洪BI到底有多好用?知乎大V用3000字力荐
  12. qlistview 自定义控件_QT中QListView中放置自定义控件并添加滚动条
  13. CentOS8下安装wget、wget2
  14. qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in
  15. JAVA类似ABP框架_【Net】ABP框架学习之它并不那么好用
  16. 淘宝数据魔方技术架构解析
  17. Unity 径向模糊 简易解决方案
  18. 程序安装报错0x80070660的解决
  19. 软件测试需求标准 国标,国家标准 GBT 15532-2008 计算机软件测试规范(60页)-原创力文档...
  20. SRS与SOW与PM

热门文章

  1. vs2017项目配置
  2. php 修改 apk名称6,反编译sencha toucha打包的apk文件,修改应用名称支持中文以及去除应用标题栏...
  3. 中国量子计算机 是纠缠,量子纠缠获得突破,中国量子计算机问世,民营企业立下显著功勋...
  4. cs寄存器 x86 特权模式_Windows操作系统管理进程和线程:内核模式和用户模式
  5. Elasticsearch 单机安装
  6. 3.5 将 Batch Norm 拟合进神经网络
  7. Pandas GroupBy 分组(分割-应用-组合)
  8. python 菜品识别_利用百度智能云结合Python体验图像识别(来自qylruirui)
  9. 2020年海南大学计算机调剂,2020年海南大学招收调剂生
  10. oracle定位数据库读写高,oracle数据库CPU过高问题定位、分析(三)