我遇到过GC没有时间删除空闲对象的情况。代码将一个大文档加载到内存中,并在循环中处理它。如果我在这个循环中停止(在调试模式下)或添加GC.Collect(),内存使用量就会降到70MB以下。
如何调优GC?有没有调优GC的最佳实践?
发布于 2010-09-02 23:40:30
这里最好的调优就是不去管它。
但是,如果您的进程真的一直在阻塞GC (它不应该),那么在一些消耗内存的部分完成后调用GC.Collect()可能会有所帮助。
但是我们需要更多的信息。什么类型的应用程序,为什么(您认为) GC没有时间正常运行?
发布于 2012-12-11 04:27:16
首先,您需要探索当您的程序运行时垃圾收集器内部发生了什么。通常,垃圾收集器擅长在没有您干预的情况下决定何时删除对象。但是,它不容易出错。例如,您可能保留了一个小型对象列表,其中包含对您预期即将消亡的大型对象的引用。要了解GC中的瓶颈,您需要分析GC内存分配。要做到这一点。
1)在windows start中搜索“性能监视器”。
2)在监控工具选项卡下,选择性能监视器。通过"right click-> remove all counters“清除已有的计数器
3)右键单击->add counters
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)还有更多……(谷歌搜索GC内存问题)
由于您无法识别哪些对象存在于不同的代间,您可以使用ANST memory profile之类的工具来查看是否无意中将寿命较短的对象提升到了第2代。profiler允许您查看谁持有对大对象的引用,并进入不同的垃圾收集器存储空间(例如,谁生活在第2代,谁生活在大对象堆中)。但是,在进行任何高级性能调优之前,请使用windows性能监视器来确定瓶颈是否确实与GC有关。
https://stackoverflow.com/questions/3628512
复制相似问题