概述内存占用增加 虚惊一场还是内存泄漏?
我有一个graphics程序,我一次又一次地创build和销毁相同的对象。 总而言之,有140个对象。 他们得到删除和新的,这样的数字永远不会增加140.这是一个要求,因为它是一个压力testing,即我不能有一个内存池或虚拟对象。 现在我相当确定没有任何内存泄漏。 我也正在使用内存泄漏检测器,这是不报告任何泄漏。
问题是程序的内存占用量不断增加(虽然相当缓慢,比对象被破坏/创build的速度要慢)。 所以我的问题是,增加的内存占用是否是内存泄漏的一个可靠的标志,或者它有时可能是骗人的?
编辑:我使用新build/删除来创build/销毁对象
使用gflags + ust,进程内存增加更快
当SSL和客户端证书与httpWebRequest对象一起使用时,内存泄漏
*** 作系统相关的C ++内存泄漏?
linux中C ++应用程序的内存稳定性
堆大小不断增加,直到应用程序崩溃(C ++)
有没有一种方法来定位进程的哪一部分使用大部分内存,只查看生成的核心文件?
在ASP.NET Web App中查找内存泄漏
C ++(窗口)中的分配号码及其预测性
linux getlogin()内存泄漏
内存泄漏deBUGging与windbg没有用户堆栈跟踪
这种行为似乎可能来自没有泄漏的情况。
有没有机会让你的堆碎片化 ?
假设你做大量的大小为n的分配。 你可以将它们全部释放,这使得你的C库将这些缓冲区插入到一个空闲列表中。 一些其他的代码路径然后使得分配小于n ,所以空闲列表中的块被分成更小的单元。 然后,循环的下一个迭代会执行另一批量的大小为n的分配,并且空闲列表不再包含该大小的连续内存, malloc必须向内核请求更多的内存。 最终,这些“小于”的分配将被释放,就像你的“大小”分配一样,但是如果在存在碎片的地方运行足够多的迭代,我可以看到这个过程逐渐增加了内存占用。
避免这种情况的一种方法可能是分配所有的对象一次,而不是分配/释放它们。 由于你使用C ++,这可能需要新的或类似的位置 。 由于您使用的是windows,因此我可能会提到Win32支持在一个进程中有多个堆 ,所以如果您的对象来自不同于其他分配的堆,则可以避免这种情况。
这取决于你是否在一个CLR(或一个垃圾收集器的虚拟机)或你仍然在旧模式(如C + +,MFC等…)
当你有GC时 – 只有当你测试了足够长的时间,你才能真正知道。 GC可以决定暂时不清理你的对象…(有办法强制它)
在本地应用程序中,是的,占用空间增加可能意味着泄漏。
有一些工具(非常好的工具)的c + +发现这些泄漏(谷歌devpartner或边界检查器)
我猜也有一些用于C#和Java的工具。
如果您的应用程序的进程占用空间增加超出了合理的限制,这取决于您的应用程序及其功能,并且持续增加,直到最终您将耗尽虚拟内存,您肯定会发生内存泄漏。
尝试CRT中包含的内存分配测试: http : //msdn.microsoft.com/en-us/library/e5ewb1h3%28VS.80%29.aspx
他们帮助很多。
但是我注意到,如果你看一些因素,应用程序往往会改变内存消耗。 windows 7也可能会在内存分配中创建额外的填充来修复错误: http : //msdn.microsoft.com/en-us/library/dd744764%28VS.85%29.aspx
我强烈建议尝试Visual Studio 2015(社区版是免费的)。 它配备了诊断工具,可帮助您分析内存使用情况; 它允许您拍摄快照并查看堆
总结
以上是内存溢出为你收集整理的内存占用增加 虚惊一场还是内存泄漏?全部内容,希望文章能够帮你解决内存占用增加 虚惊一场还是内存泄漏?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容