所以,我最近注意到我们的开发服务器在某个项目完成开发之后剩下的4GB内存中有一个稳定的〜300MB。假设这是由于开发阶段的内存泄漏导致的,那么内存最终是否会自行释放,或者是否需要重新启动服务器。是否有任何工具可以用来防止这种情况发生(除了明显的'不写代码产生内存泄漏')?有时他们看不到一段时间,随着时间的推移,我想他们加在一起,因为你继续测试你的应用程序。开发过程中发生内存泄漏
回答
不要假设任何事情,运行内存分析器,看看它在做什么。
我没有看到.Net分析器如何帮助C应用程序... – 2009-11-04 21:07:39
哦,是的,标签,我错过了,我的道歉。 – Fred 2009-11-04 21:11:29
你正在运行什么操作系统?当这些进程退出时,大多数操作系统都会清理进程的泄漏内存。您正在使用的内存可能正在被用于文件系统缓存。这是无需担心的 - 操作系统将在必要时回收该内存。
来自:http://learnlinux.tsf.org.za/courses/build/internals/ch05.html
的自由存储器由 自由命令指示的量包括在其 计算当前 大小缓冲器缓存。这是误导性的,因为 指示的空闲内存量 通常会非常低,因为缓存器 缓存很快会填满大部分用户内存。 不要“恐慌。应用程序是 可能没有拥挤你的RAM;它只是 只是缓冲区高速缓存,所有可用空间取 。可 应用程序使用的内存 高速计数为存储空间(记住, 按要求将缩小),因此 减去缓存 的大小看的空闲内存 可用的实际金额为应用程序中使用
在开发过程中最好与他们战斗,因为这样可以更容易地识别引入泄漏的修订。正如你现在可能看到的那样,在事实之后这样做非常非常困难。运行该工具时预计的报道很多,我建议如下:
http://www.ibm.com/software/awdtools/purify/
http://directory.fsf.org/project/ElectricFence/
我建议你运行该工具,大约泄漏消除大多数警告和然后逐个修复它们,消除这些抑制。
然后,确保您经常运行这些工具并快速修复任何回归!
当然,显而易见的答案是“不要编写产生内存泄漏的代码”,这是一个有效的方法,因为如果您有引用计数问题,或者代码复杂跟踪记忆的生命周期。
为了解决您当前的情况,您可以考虑使用诸如DevPartner for Windows或Valgrind for Linux/Unix的工具,这两种工具对于追踪内存泄漏(以及其他问题)都非常有效如性能瓶颈)。
另一件你可能希望考虑的事情是看你对指针的使用,如果可以的话,用指针慢慢地替换它们,这应该有助于管理指针的生命周期。
不,我怀疑内存是否会恢复,而不重新启动您的代码运行的过程。
我同意除了这项业务以外的所有关于“智能指针”的内容。这些东西在C编程语言中不存在。 – BobbyShaftoe 2009-11-04 21:57:46
啊,非常好点Bobby ....住在C++的土地太久了! – NeilDurant 2009-11-04 22:14:25
如果这是在Linux上,请检查'free'的输出并特别检查'cached'ram的数量。如果您的开发工作包含大量磁盘I/O,它将使用它来缓存文件,并且您将看到很少的“可用”,但如果需要它仍然存在。出于所有实际目的,请考虑将free + cached视为可用。
“自由”输出从/ proc/meminfo中蒸馏,你可以得到在/ proc/$ PID /正在运行的进程的详细信息{地图,smaps}
从理论上讲,当你的进程退出,它释放的任何内存。你的程序正在退出吗?
当我在大学时,我们使用了Borland C++ Builder 6 IDE 它包含CodeGuard,它检查内存泄漏和其他内存相关问题。 我不确定这个选项在新版本中是否仍然可用,但是如果新版本的功能较少,这将会很奇怪。
在Linux上,如前所述,valgrind是一个很好的内存泄漏调试器。
- 1. 内存泄漏 - 它们何时发生?
- 2. Runnable和ScheduledExecutorService发生内存泄漏
- 3. 内存泄漏会发生什么?
- 4. 使用UIwebview时发生内存泄漏
- 5. 使用NSPropertyListSerialization时发生内存泄漏
- 6. 使用stringwithformat时发生内存泄漏
- 7. Jenkins上的PowerMock发生内存泄漏
- 8. 使用CLLocationCoordinate2D时发生内存泄漏
- 9. 定时器发生内存泄漏
- 10. 在ffmpeg中打开编码器时发生内存泄漏
- 11. C++发现内存泄漏
- 12. NSInvocation触发内存泄漏
- 13. 在Windows上开发程序中的内存泄漏检测
- 14. 在AsyncTask中启动内存时发生内存泄漏(从线程中更改)
- 15. 正在发布UIImageView,并且仍然发生内存泄漏
- 16. iPhone开发内存泄露
- 17. Xcode 4内存泄漏仪器如何获得泄漏发生的代码行
- 18. 在仿真器中运行时发生内存泄漏错误
- 19. 在Objective-C中使用TBXML时发生内存泄漏
- 20. ScrollViewer中的图像发生内存泄漏
- 21. 当显示UIAlertView中的的iOS 6.1.2,内存泄漏发生
- 22. 在cvFindContours中使用CvSeq时发生内存泄漏
- 23. 在一个循环中使用NSReadPixel时发生内存泄漏
- 24. iOS中向量的向量发生内存泄漏
- 25. 在GeoIP_new API中可能发生内存泄漏C
- 26. 从sqlite中获取数据时发生内存泄漏
- 27. 使用JaxWsProxyFactoryBean在Java和Spring中发生内存泄漏
- 28. 结构中的NSDate可能会发生内存泄漏
- 29. 在循环中调用openopt SNLE时发生“内存泄漏”
- 30. valgrind没有发现内存泄漏?
在这里有一个cron作业重新启动进程?一些PHP安装使用这种技术。 – jldupont 2009-11-04 21:04:07
什么编程环境? Java的? 。净? – florin 2009-11-04 21:07:31
@florin:“C”标签建议C;) – Will 2009-11-04 21:16:28