【问题标题】:how to find memory leaks in a very slow application?如何在非常慢的应用程序中找到内存泄漏?
【发布时间】:2012-09-22 06:32:15
【问题描述】:

我有一个用 C 语言编写的程序,它使用 Berkeley-Db、glib-2 和 libxml-2。它是一个搜索索引器,它使 NLP 具有句法和语义分析,并将概念结构存储在搜索索引中而不是单词中。

但是,我有一个问题 - 大约一天后,我的程序内存不足。

当我尝试在 valgrind 下运行我的程序时,它的运行速度非常慢,在我看来,比正常运行慢 10 倍。

我所有检查内存泄漏的尝试(在 valgrind 下进行了数周左右)都没有显示任何泄漏。

有人知道在这种情况下可以帮助我的一些工具吗?

【问题讨论】:

  • 这可能不是泄漏,只是您已经使用了所有内存吗?奥卡姆剃刀等等。
  • @tbert 我不这么认为,看起来不像这样。每个文档之后都会释放内存。
  • 这可能是您的地址空间碎片化,即使您有空闲内存,也无法为缓冲区分配足够大的连续地址空间块。如果您的应用目前是 32 位的,那么转为 64 位可能是个好主意。
  • @AlexeyFrunze 我的应用是 64 位的。
  • 我在类似情况下使用 Deleaker...

标签: c memory-leaks valgrind memory-leak-detector


【解决方案1】:

我的解决方案是:

#define malloc(size) mymalloc(size, __FILE__, __FUNCTION__, __LINE__)
... (realloc, calloc, free)

void *mymalloc(size_t size, char *file, char *function, int line)
{
  void *data = malloc(size);
  addList(data, size, file, function, line);
  return data;
}

void myfree(void *data)
{
  removeList(data);
  free(data);
}

void debugalloc()
{
  printList();
}

removeList() 将在全局列表中搜索“数据”并将其删除,或者给出警告。用“debugalloc();”您应该打印整个列表(通常它应该是空的,或者充满了您期望的内容)。

另一种选择: 你的内存管理变得支离破碎,......(upps,Alexey Frunze 在一秒钟前在 cmets 部分写道。)

伊迪丝:XML

我发表了关于 DOM 和 SAX 的评论,我感觉只是为了扩展这个评论:

<head><data>...</data><data>...</data>......<data>...</data></head>

是 SAX 的绝佳候选者。在 DOM 中,整个 XML 将被读取并转换为内存,如果 本身是由不同大小的值构成的,这会很快导致内存碎片化。您的操作系统的内存模型可能无法分配少量内存。

使用 SAX,您只需将部分数据加载到内存中,并在使用后立即将其删除。但是你的实现必须从遍历 Document 变成一种状态机,带有馈送()和消费/处理()。

【讨论】:

  • 也许我应该试试这个......我应该怎么做才能确定我的记忆变得支离破碎?另外,如何处理分配在库中但不在我的应用程序中的 glib/db4/libxml2 结构?
  • libxml2 有自己的 malloc-callback。 (您可以使用 mymalloc 对应项覆盖 libxml2 正在使用的函数)(请参阅:xmlsoft.org/html/libxml-xmlmemory.html
  • 关于您的 XML:SAX 还是 DOM?如果您使用 DOM 并且遇到内存问题(DOM 非常分散缓冲区),您有时可以选择更改为 SAX。
  • libxml2 有自己的 malloc-callback,但是 db4 和 glib2 呢?我使用 SAX,有时使用 DOM,但 XML 处理仅用于初始化。在每个线程中读取两个 xml 文件——一个带有构成语法(大约 2000 个节点),一个带有标点符号(后者使用 SAX 读取)。 NLP 机器在每处理 5 个文档后重新初始化,因此重新加载这些文件。但是,在使用 DOM 时,我在加载 XML 的函数中释放了 xmlDoc 结构。
  • 对不起,我出去了。 glib2和db4我没用过,所以一定要别人接手。
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多