Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET垃圾收集(GC)调优_.net_Garbage Collection_Performance - Fatal编程技术网

.NET垃圾收集(GC)调优

.NET垃圾收集(GC)调优,.net,garbage-collection,performance,.net,Garbage Collection,Performance,我遇到了GC没有时间删除自由对象的情况。代码将一个大文档加载到内存中,并在循环中处理它。如果我在这个循环中停止(在调试模式下)或添加GC.Collect(),内存使用量将下降到70 MB以下 如何调整GC?有没有调优GC的最佳实践?这里的最佳调优方法是不去管它 但是,如果您的进程真的一直在阻塞GC(不应该),那么在一些内存消耗部分完成后调用GC.Collect()可能会有所帮助 但是我们需要更多的信息。哪种类型的应用程序,为什么(您认为)GC没有时间正常执行 首先,您需要了解程序运行时垃圾收集器

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


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

这里的最佳调优方法是不去管它

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


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

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

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

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

3) 右键单击->添加计数器

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

5) 一旦你运行了你的计数器,请阅读以下文章,找出你程序中的瓶颈

垃圾收集器基础知识

性能监视器计数器告诉您什么 http://netrsc.blogspot.com.es/2008/01/net-clr-memory-performance-monitoring.html

一旦你熟悉了基本知识,就要寻找以下问题 1) 大型对象堆碎片化太快

2) 想要快速消亡的对象将在第2代中结束 例如中年危机

3) 提交的总字节数不断增加

4) 你花太多时间收集垃圾

5) 还有更多。。。(谷歌搜索GC内存问题)


由于您无法识别哪些对象生活在不同的代中,您可以使用ANST内存配置文件之类的工具来查看是否无意中将短期对象升级到第2代中。探查器允许您查看谁持有对大型对象的引用,并将其峰值放入不同的垃圾收集器存储(例如,谁生活在第2代谁生活在大型对象堆中)。但是,在进行任何高级性能调优之前,请使用windows性能监视器来确定瓶颈实际上是否与GC有关

您能否提供有关您的场景以及GC如何影响您的应用程序的更多详细信息?你怎么知道GC“没有时间”删除对象?不能说我做过任何事情,更不用说GC了。然而,如果你在这里搜索一下,你会发现有一个压倒性的最佳实践,就是不要这样做。调整应用程序以正确分配和
Dispose()
,GC将与您一起工作。代码将大文档读入内存并处理它,因此在其中一个方法中,会显示循环,在其中执行此文档的处理。如果我在这个循环中停止(在调试模式下)或添加小于70MB的GC.Collect()内存。如果你不在循环中提供帮助,那么确切的问题是什么?为什么这么高的内存使用率很重要?如果需要,GC会将其清除。大多数时候,它不需要这样做,所以就不用管它了。是的,我知道,但是呼叫付费方法是床上练习还是床上练习?@jitm:是的,一般来说这是一种糟糕的练习。你需要提供更多的信息,才有人可以说,如果这将是一个解决方案为你。我已经添加了一些信息作为上述评论。一般来说,在内存中处理大文件。