我有GC没时间删除空闲对象的情况。代码将大文档加载到内存中并在循环中处理它。如果我在此循环中停止(在调试模式下)或添加GC.Collect(),则内存使用量将降至70 MB以下。
如何调整GC?是否有调整GC的最佳实践?
答案 0 :(得分:3)
首先,您需要在程序运行时探索垃圾收集器内部发生的情况。通常垃圾收集器擅长决定何时在没有您干预的情况下移除对象。但是,它不容易出错。例如,您可能会保留一个小对象列表,这些对象包含您希望很快就会死亡的大对象的引用。要了解GC中的瓶颈,您需要分析GC内存分配。要做到这一点......
1)在Windows启动中搜索“性能监视器”
2)在监视工具选项卡下,选择性能监视器。通过“右键单击 - >删除所有计数器”
清除您已有的所有计数器3)右键单击 - > gt;添加计数器
4)选择“.NET CLR memory”下的所有计数器。添加它们时,请确保启动程序并从左侧列表中选择程序。这将确保您的计数器将报告您的程序的性能,而不是其他任何
5)一旦你的计数器运行,请阅读以下文章,找到程序中的瓶颈。
垃圾收集器基础知识 http://msdn.microsoft.com/en-us/magazine/bb985010.aspx
性能监视器计数器告诉您什么 http://msdn.microsoft.com/en-us/library/x2tyfybc.aspx http://netrsc.blogspot.com.es/2008/01/net-clr-memory-performance-monitoring.html
熟悉基础知识后,请查看以下问题 1)大对象堆碎片过快
2)你想要快速死亡的物体在第2代结束 例如。中年危机http://blogs.msdn.com/b/ricom/archive/2003/12/04/41281.aspx
3)总提交字节数不断增加
4)你花了太多时间收集垃圾
5)还有更多......(google for GC memory issues)
由于您无法识别不同代中的哪些对象,因此您可以使用类似ANST内存配置文件的内容来查看是否无意中将短期对象提升为第2代。分析器允许您查看谁拥有对大型对象的引用高峰进入不同的垃圾收集器存储(例如,居住在第2代的人居住的是大对象堆)。但在进行任何高级性能调整之前,请使用Windows性能监视器来确定您的瓶颈是否与GC有关。
答案 1 :(得分:2)
这里最好的调整是不管它。
但是如果你的进程实际上一直阻塞GC(它不应该),那么在某些内存消耗部分完成后调用GC.Collect()
会有所帮助。
但我们需要更多信息。什么类型的应用程序,为什么(您认为)GC没有时间正常进行?