【问题标题】:.NET Garbage Collection (GC) Tuning.NET 垃圾收集 (GC) 调优
【发布时间】:2010-09-02 15:14:00
【问题描述】:

我遇到 GC 没有时间删除空闲对象的情况。该代码将一个大文档加载到内存中并循环处理它。如果我在此循环中停止(在调试模式下)或添加 GC.Collect(),内存使用量将降至 70 MB 以下。

如何调整 GC?有没有调整 GC 的最佳实践?

【问题讨论】:

  • 您能否详细介绍一下您的场景以及 GC 如何影响您的应用程序?你怎么知道GC“没有时间”删除对象?
  • 不能说我曾经调整过任何东西,更不用说 GC。但是,如果您在这里进行一些搜索,您会发现有一个压倒性的最佳实践不要这样做。调整您的应用程序以正确分配和Dispose(),GC 将与您合作。
  • 代码将大文档读入内存并处理它,因此在其中一种方法中呈现循环处理该文档的位置。如果我在此循环中停止(在调试模式下)或添加 GC.Collect() 内存小于 70 MB。
  • 如果您在循环中不提供帮助,具体的问题是什么?
  • 为什么这么高的内存使用很重要?如果需要,GC 会删除它。大多数时候,它不需要,所以它就不管它了。

标签: .net garbage-collection performance


【解决方案1】:

首先,您需要了解程序运行时垃圾收集器内部发生的情况。通常垃圾收集器擅长在没有您干预的情况下决定何时删除对象。但是,它不容易出错。例如,您可能会保留一个小对象列表,其中包含对您预计很快就会死去的大对象的引用。要了解 GC 中的瓶颈,您需要分析 GC 内存分配。为此...

1)在windows start中搜索“性能监视器”

2) 在监控工具选项卡下选择性能监控器。通过“右键单击->删除所有计数器”清除您已经拥有的所有计数器

3)右键->添加计数器

4) 选择“.NET CLR 内存”下的所有计数器。添加它们时,请确保启动程序并从左侧列表中选择程序。这将确保您的计数器将报告您的程序的性能,而不是其他任何内容

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 内存问题)

由于您无法确定哪些对象存在于不同的世代中,您可以使用诸如 ANST 内存配置文件之类的东西来查看您是否无意中将短期对象提升到第 2 代。剖析器允许您查看谁拥有对大对象的引用以及峰值进入不同的垃圾收集器存储(例如,谁住在第 2 代,谁住在大对象堆中)。但在进行任何高级性能调整之前,请使用 Windows 性能监视器来确定您的瓶颈是否实际上与 GC 有关。

【讨论】:

    【解决方案2】:

    这里最好的调整是不要管它。

    但是,如果您的进程确实一直在阻塞 GC(它不应该),那么在一些内存消耗部分完成后调用 GC.Collect() 可能会有所帮助。

    但我们需要更多信息。什么类型的应用,为什么(你认为)GC没时间正常做?

    【讨论】:

    • 是的,我知道,但是调用 Collect 方法是卧床练习还是不是?
    • @jitm:是的,这通常是一种不好的做法。您需要提供更多信息,然后才能有人说这是否适合您。
    • 我在上面的评论中添加了一些信息。一般处理内存中的大文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多