首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET垃圾收集(GC)调优

.NET垃圾收集(GC)调优
EN

Stack Overflow用户
提问于 2010-09-02 23:14:00
回答 2查看 3.9K关注 0票数 3

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-02 23:40:30

这里最好的调优就是不去管它。

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

但是我们需要更多的信息。什么类型的应用程序,为什么(您认为) GC没有时间正常运行?

票数 2
EN

Stack Overflow用户

发布于 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有关。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3628512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档