我有一个wcf服务作为Windows服务托管,具有以下功能:
public int SendMultipleMessages(List<Message> messages)
{
foreach (var message in messages)
{
//Do some stuff with the messages ie. get an id to return, save info in a db.
}
//Would it make sence to collect here ??
Gc.Collect();
Task.Factory.StartNew(() =>
{
//very time demanding task
_sendRequestHandler.SendMultipleMessages(BatchId);
});
return BatchId;
}
列表&lt;消息&gt;对象(通常情况下)通常使用高达1 GB的内存,在这样的情况下调用GC.Collect是有意义的,因为我不再使用该列表,或者我应该让垃圾收集器自己处理这个?
答案 0 :(得分:5)
简短回答:否。
如果您致电GC.Collect()
,可能会遇到问题。这是非常罕见的。
在您当前的示例中,在给出当前代码时无效。除非您物理清除 Message
个对象列表,否则它们不会被垃圾收集,因为调用者仍然具有<{1}}中对象的引用实例
当然,该建议基于以下假设:每个List<T>
对象都不存在其他引用。
您可以通过从Message
处理消息对象后删除消息对象,或者切换到本质上体现此原则的数据结构,例如{{1} }或List<T>
取决于您的订购要求。
Queue<T>
答案 1 :(得分:1)
让GC管理自己,根据可用的资源等因素在每台机器上进行不同的优化。您自己调用它可能会影响应用程序的性能。