2009-11-04 46 views
0

所以,我最近注意到我们的开发服务器在某个项目完成开发之后剩下的4GB内存中有一个稳定的〜300MB。假设这是由于开发阶段的内存泄漏导致的,那么内存最终是否会自行释放,或者是否需要重新启动服务器。是否有任何工具可以用来防止这种情况发生(除了明显的'不写代码产生内存泄漏')?有时他们看不到一段时间,随着时间的推移,我想他们加在一起,因为你继续测试你的应用程序。开发过程中发生内存泄漏

+0

在这里有一个cron作业重新启动进程?一些PHP安装使用这种技术。 – jldupont 2009-11-04 21:04:07

+0

什么编程环境? Java的? 。净? – florin 2009-11-04 21:07:31

+0

@florin:“C”标签建议C;) – Will 2009-11-04 21:16:28

回答

0

不要假设任何事情,运行内存分析器,看看它在做什么。

+0

我没有看到.Net分析器如何帮助C应用程序... – 2009-11-04 21:07:39

+0

哦,是的,标签,我错过了,我的道歉。 – Fred 2009-11-04 21:11:29

2

你正在运行什么操作系统?当这些进程退出时,大多数操作系统都会清理进程的泄漏内存。您正在使用的内存可能正在被用于文件系统缓存。这是无需担心的 - 操作系统将在必要时回收该内存。

来自:http://learnlinux.tsf.org.za/courses/build/internals/ch05.html

的自由存储器由 自由命令指示的量包括在其 计算当前 大小缓冲器缓存。这是误导性的,因为 指示的空闲内存量 通常会非常低,因为缓存器 缓存很快会填满大部分用户内存。 不要“恐慌。应用程序是 可能没有拥挤你的RAM;它只是 只是缓冲区高速缓存,所有可用空间取 。可 应用程序使用的内存 高速计数为存储空间(记住, 按要求将缩小),因此 减去缓存 的大小看的空闲内存 可用的实际金额为应用程序中使用

1

使用Linux x86盒子上的例外valgrind运行该程序。

Windows上提供了一个商业平等,Purify

程序的这些运行时分析将报告内存泄漏和其他错误,如缓冲区溢出和单位变量。

静态代码分析 - LintCoverity例如 - 也可以发现内存泄漏和更严重的错误。


让我们具体什么内存泄漏引起,以及他们如何伤害你的程序:

如果你的程序运行过程中“泄漏”内存是有风险的,你的应用程序将最终排RAM和交换,或程序可用的地址空间(可能小于物理RAM),并导致下一次分配失败。绝大多数程序将无法捕捉到这个错误,因为错误检查比看起来更难。大多数程序将通过取消引用空指针或者退出而失败。

1

在开发过程中最好与他们战斗,因为这样可以更容易地识别引入泄漏的修订。正如你现在可能看到的那样,在事实之后这样做非常非常困难。运行该工具时预计的报道很多,我建议如下:

http://valgrind.org/

http://www.ibm.com/software/awdtools/purify/

http://directory.fsf.org/project/ElectricFence/

我建议你运行该工具,大约泄漏消除大多数警告和然后逐个修复它们,消除这些抑制。

然后,确保您经常运行这些工具并快速修复任何回归!

1

当然,显而易见的答案是“不要编写产生内存泄漏的代码”,这是一个有效的方法,因为如果您有引用计数问题,或者代码复杂跟踪记忆的生命周期。

为了解决您当前的情况,您可以考虑使用诸如DevPartner for Windows或Valgrind for Linux/Unix的工具,这两种工具对于追踪内存泄漏(以及其他问题)都非常有效如性能瓶颈)。

另一件你可能希望考虑的事情是看你对指针的使用,如果可以的话,用指针慢慢地替换它们,这应该有助于管理指针的生命周期。

不,我怀疑内存是否会恢复,而不重新启动您的代码运行的过程。

+0

我同意除了这项业务以外的所有关于“智能指针”的内容。这些东西在C编程语言中不存在。 – BobbyShaftoe 2009-11-04 21:57:46

+0

啊,非常好点Bobby ....住在C++的土地太久了! – NeilDurant 2009-11-04 22:14:25

0

如果这是在Linux上,请检查'free'的输出并特别检查'cached'ram的数量。如果您的开发工作包含大量磁盘I/O,它将使用它来缓存文件,并且您将看到很少的“可用”,但如果需要它仍然存在。出于所有实际目的,请考虑将free + cached视为可用。

“自由”输出从/ proc/meminfo中蒸馏,你可以得到在/ proc/$ PID /正在运行的进程的详细信息{地图,smaps}

从理论上讲,当你的进程退出,它释放的任何内存。你的程序正在退出吗?

0

当我在大学时,我们使用了Borland C++ Builder 6 IDE 它包含CodeGuard,它检查内存泄漏和其他内存相关问题。 我不确定这个选项在新版本中是否仍然可用,但是如果新版本的功能较少,这将会很奇怪。

在Linux上,如前所述,valgrind是一个很好的内存泄漏调试器。

相关问题