Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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
C#设置更积极的垃圾收集_C#_Memory Management_Garbage Collection - Fatal编程技术网

C#设置更积极的垃圾收集

C#设置更积极的垃圾收集,c#,memory-management,garbage-collection,C#,Memory Management,Garbage Collection,我有一个程序,可以在内存中收集大量数据,经过分析后,也可以很快将其丢弃。问题是内存消耗越来越高。我想将垃圾收集器设置为更频繁地收集,以减少内存量。如果不直接调用gc.collect()(这是一种不好的做法),这是可能的吗,然后对数据进行处理,为了避免内存消耗不断增加,而只是为了让应用程序/系统暂停GC暂停,那么您需要不惜一切代价避免新的分配 为此,您应该避免不可变的数据类型。不要将原始数据存储在类/列表等中,而是查看是否可以将数据存储在诸如byte[]数组之类的东西中,这些数组可以清空并重新使用

我有一个程序,可以在内存中收集大量数据,经过分析后,也可以很快将其丢弃。问题是内存消耗越来越高。我想将垃圾收集器设置为更频繁地收集,以减少内存量。如果不直接调用
gc.collect()
(这是一种不好的做法),这是可能的吗,然后对数据进行处理,为了避免内存消耗不断增加,而只是为了让应用程序/系统暂停GC暂停,那么您需要不惜一切代价避免新的分配

为此,您应该避免不可变的数据类型。不要将原始数据存储在类/列表等中,而是查看是否可以将数据存储在诸如byte[]数组之类的东西中,这些数组可以清空并重新使用,而无需重新分配。然后将数组封装在读卡器中,读卡器在处理过程中解析并理解数据


简而言之,在这种情况下,
new
关键字是您最大的敌人。

您需要确保没有任何数据句柄。 这些措施可包括:

  • 列入清单
  • 附加到对象的委托或事件
  • 成员变量
这些代理特别神秘,因为您没有意识到他们正在阻止数据

我有一个在内存中收集大量数据的程序, 分析后,也会很快将其丢弃


GC.Collect()放在那里是有原因的,就是这样。有时,您对托管堆的状态了解得太多了,因此可以选择最佳时间进行额外的垃圾收集。

调用
gc.Collect()的原因
不好的做法是因为您不应该关心内存消耗-CLR会为您这样做-这是托管资源的一点…好的一点。但有时它确实会减慢你的机器,而这并不是必须的。用户并不特别喜欢这样。我在处理后台程序。还有在虚拟机或旧机器上运行的程序。不,这是不可能的