C# (.NET) 应用程序的内存使用率非常高,直到我调用 System.GC.Collect()。

3
我编写了一个应用程序,它会启动几个线程,每个线程会读取数兆字节的内存。然后,每个线程会连接到互联网并上传数据。这种情况会发生成千上万次,每次上传需要一些时间。
我发现(使用windbg/sos和!dumpheap进行验证)Byte[]没有被自动回收,导致任务管理器中报告100/150MB的内存。
如果我调用System.GC.Collect(),我会看到内存大幅下降,超过100MB。
我不喜欢调用System.GC.Collect(),而且我的电脑有大量可用内存。但是,如果有人查看任务管理器,他们会感到担忧,认为我的应用程序泄漏严重。
有什么建议吗?
2个回答

12

运行时利用大量的空闲内存来减少垃圾收集器对应用程序性能的影响。这里的“问题”是一般缺乏理解(例如您的用户),即当系统有更多的内存时,使用它是可以的(否则有什么意义呢?)。


1
@Chris,如果你更多地了解GC,你会发现这种内存占用是可以预期的。当你捕获转储时,GC还没有释放Byte[]的时间。 - Lex Li
@Chris:280z28和Lex是正确的。只要您不比必要的时间长保留byte[]引用,就没有什么可担心的。.NET应用程序倾向于使用比本机应用程序更多的内存,因为GC会在需要时进行清理。 - Steven
我明白你的意思...就像传教士/唱诗班一样...我已经多次重申了上面的建议。直到现在,我一直认为自己是正确的。我的问题是,如果你有大量的RAM,除非你用windbg/sos四处探索,否则所有迹象都指向一个行为不端的应用程序。我的用户倾向于有点聪明,但不是程序员...他们通过寻找大量的RAM使用情况来跟踪和修复行为不端的应用程序...我想我必须承认错误...当我的应用程序完成大部分繁重的工作时,我应该调用Collect(),否则(如我所测量的),我的应用程序将在任务管理器中被杀死。 - stuck
假设我的应用程序在任务管理器中被终止(这很糟糕,我必须在重新启动时取消事务)。如何最好地调用Collect()以避免损坏收集器? - stuck

3

问题在于,有些用户会检查内存和CPU的使用情况,并报告说您的应用程序消耗过多,即使他们的性能没有问题。我认为他们这样做是为了向他们的上司/女友/同伴展示他们对计算机的了解程度。

在您的应用程序中仔细放置CG.Collect可能会减少这种人为(而非计算机)问题。我认为您应该这么做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接