【发布时间】:2012-10-01 11:47:09
【问题描述】:
我们有一个 C# 应用程序,它控制我们的一个设备并对该设备给我们的信号做出反应。
基本上,应用程序创建线程、处理操作(访问数据库等)并与此设备通信。
在应用程序的生命周期中,它创建对象并释放它们,到目前为止,我们让垃圾收集器处理我们的内存。我读到强烈建议让 GC 在不干扰的情况下完成其工作。
现在我们面临的问题是,我们的应用程序的过程会不断增长,并且会逐步增长。示例:
当应用程序增长时似乎有“波”,突然间,应用程序释放了一些内存,但同时似乎留下了内存泄漏。
我们正在尝试使用一些内存分析器来调查应用程序,但我们想深入了解垃圾收集器的工作原理。
- 我在这里找到了一篇很棒的文章:The Danger of Large Objects
- 我还在这里找到了官方文档:MSDN
你们知道另一个非常深入的 GC 文档吗?
编辑:
这是一个说明应用程序行为的屏幕截图:
您可以清楚地看到我们在非常规则的模式上产生的“波浪”效果。
附属问题:
我发现我的 GC 收集 2 堆非常大,并且遵循与我的应用程序使用的总字节数相同的模式。我想这很正常,因为我们的大多数对象都会在至少 2 次垃圾回收中存活下来(例如 Singleton 类等)......你怎么看?
【问题讨论】:
-
让我这么说吧。我花了数周时间追踪与 .NET 中的内存消耗相关的问题,并且我学到了这一点。如果您正确构建对象并正确删除引用,则会立即收集内存。如果你做得正确,它需要循环来收集内存是一个神话。 所以,请为我们发布一些代码,以了解您如何构建对象和对象看起来像其他对象的引用,反之亦然。
-
你是如何测量内存使用的?
-
我假设“Mo”是兆字节?无论如何,您提供的数据并不表示内存泄漏,甚至不是问题。
-
Mo 绝对代表 MegaOctets,这意味着法语中的兆字节 :) 对不起,我一直犯那个愚蠢的错误!
-
@spender 我只是用 windows 的任务管理器检查了这个,查看了我的进程内存大小......
标签: c# garbage-collection