在C#应用程序中查找内存泄漏

时间:2012-09-18 09:39:53

标签: c# .net memory-footprint

我在C#,Framework 4中有一个应用程序。基本上,这个应用程序主要对事件做出反应并创建对象,释放它们,创建数据库连接并关闭它们。

现在,我们已经看到应用程序的进程有时以非常奇怪的方式增长。我们有两种不同的行为:

  1. 应用程序一直在增长,直到RAM达到4 GB时,通常“应该”保持在500 MB左右。后果 - >它崩溃了!
  2. 应用程序缓慢增长到1200 MB(30分钟),然后突然缩小到500 MB(一秒钟)......这个过程时不时地重复。这可能是垃圾收集器吗?
  3. 现在,为了向我们提供有关应用程序的更多信息,我想在我们的日志文件中添加应用程序进程的大小。是否可以通过本机框架?是否可以在C#中知道对象的大小?

    我也找到了应用程序NetMemoryProfiler4,但如果可能的话,我更愿意使用嵌入式日志记录!

2 个答案:

答案 0 :(得分:5)

您需要内存分析器来调试此类问题。例如:

另见the other question about memory leaks的建议。

基本上,这可以归结为在内存中找到留在这里的对象,而不应该留在这里。它可以是事件处理程序,它持有对其类的引用或某些对象的集合,这些对象包含对其父项的引用,等等。找到根本原因后,您可能需要重新构建应用程序以摆脱不必要的引用。这可以像添加遗忘事件取消订阅一样简单,但在非平凡的情况下可能需要应用一些结构设计模式。这部分是特定于应用程序的。

答案 1 :(得分:0)

也许Process课程是你正在寻找的正确的东西 使用Process myProcess = Process.GetCurrentProcess()获取当前流程 然后,您可以使用myProcess的{​​{3}} WorkingSet64PrivateMemorySize64等等。