几天来,我一直在试图查找内存问题--我的程序正在使用大约3GB的内存,而它应该使用大约200 my 300 my。瓦兰公司实际上报告说,它在峰值时使用了大约300 at,并且没有报告任何内存泄漏。
程序读取一个输入文件,并存储该文件中的每个唯一单词。它是多线程的,我使用了4个线程来运行它。我的主要数据来源是:
我正在做大量的分配和释放(使用新的和删除的) --至少每个单词有两个。是否可能由于某种原因,我释放的内存没有被重用,导致程序不断获得越来越多的内存?当它继续奔跑的时候,它不断地抓住更多的东西。
总的来说,对我该去哪有什么想法吗?
编辑1(基于Graham的建议):我将尝试的一条路径是最小化分配。我将处理每个线程的一个字符串(如果一个单词比这个字符串长的话,这个字符串可能会偶尔增长),但是如果我正确地记住了我的代码,这将消除大量的新/删除调用。如果一切顺利,我将只剩下:输入缓冲区的一次分配,每线程一次的字符串分配(有一些分配),每个地图条目有两个分配(一个用于键,一个用于值)。
谢谢!
发布于 2011-07-15 13:00:43
很可能是堆碎片。因为您正在分配和释放大量的小块,所以很可能有大量的小的空闲块,它们太小了,无法被后续的分配所重用。由于这些块被有效地浪费了,进程不得不不断地从系统中获取越来越多的内存来执行新的分配。
您可能能够减轻这种影响,首先使用string::reserve()在每个字符串中保留足够大的默认容量,然后在处理完字符串后将字符串清除为空(而不是删除)。然后,保留一个空字符串列表以供重用,而不是一直分配新字符串。
编辑:编辑:上面的建议假设正在分配的对象是std::string的,如果它们不是,那么您可能仍然可以应用将旧的空对象保存起来以便重用的一般技术。
发布于 2011-07-15 13:05:17
程序释放的内存应该返回到堆中,在堆中可以再次分配。
但是,这并不意味着它被释放回操作系统。通常,应用程序将继续“拥有”已分配和释放的内存。
这是Windows应用程序吗?你是如何分配和释放内存的?你是如何决定这个应用程序使用多少内存的呢?
发布于 2011-07-15 13:07:26
如果可能的话,应该尝试将资源分配包装到类中。在构造函数中调用new,在析构函数中调用delete。尝试利用范围,以便更自动地进行内存管理。
http://en.wikipedia.org/wiki/RAII
https://stackoverflow.com/questions/6707290
复制相似问题