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会为您这样做-这是托管资源的一点…好的一点。但有时它确实会减慢你的机器,而这并不是必须的。用户并不特别喜欢这样。我在处理后台程序。还有在虚拟机或旧机器上运行的程序。不,这是不可能的