2012-09-18 49 views
3

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

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

  1. 应用程序增长到内存达到4 GB时,通常它应该保持在500 MB左右。后果 - >崩溃!
  2. 应用程序缓慢增长到1200 MB(30分钟),然后突然缩小到500 MB(在一秒钟内)...并且此过程每隔一段时间重复一次。这可以成为垃圾收集器吗?

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

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

+2

请原谅我的无知,但什么是'莫'? – Adam

+0

使用内存分析器将为您提供更多信息,并让您更有效地定位泄漏,而不是日志记录。 – Oded

+2

你从未听说过MegaOyte? –

回答

5

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

也看到the other question about memory leaks建议。

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

0

也许Process班级是你正在寻找的东西。
使用Process myProcess = Process.GetCurrentProcess()来获取当前进程。
然后你可以使用myProcesspropertiesWorkingSet64,PrivateMemorySize64等等。