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

And*_*y M 3 .net c# memory-footprint

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

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

  1. 应用程序一直在增长,直到RAM达到4 GB,通常它"应该"保持在500 MB左右.后果 - >它崩溃了!
  2. 应用程序缓慢增长到1200 MB(30分钟),然后突然缩小到500 MB(一秒钟)......这个过程时不时地重复.这可能是垃圾收集器吗?

现在,为了向我们提供有关应用程序的更多信息,我想在我们的日志文件中添加应用程序进程的大小.是否可以通过本机框架?是否有可能在C#中知道对象的大小?

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

Ole*_*sov 5

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

另请参阅有关内存泄漏的其他问题的建议.

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