延迟对象的集合

时间:2014-02-13 23:36:36

标签: c# java garbage-collection

根据this answer一个相当可靠的来源,在C#中,一旦GC可以证明它将不再被使用,即使对它的引用仍然存在,也可以收集一个对象。这可能导致令人惊讶的早期最终确定问题。

如果您特意想要将对象的收集延迟到某一点,那么最好的方法是什么?我们不能通过简单地保持对对象的引用来做到这一点,如果我们尝试简单地使用引用来停止GC,那么这些操作可能会被优化掉。我们能做什么?

(这个问题的动机是Java中的an older question,其中有人想要确保在WeakReferences被他们的指示对象排序时不会收集WeakReferences列表的所指对象。因此,一个解释在这种情况下,Java的行为与C#的行为类似或不同,并且也可以理解Java中相应问题的解决方案。)

1 个答案:

答案 0 :(得分:1)

您可以考虑GCHandle.Alloc来阻止收集管理对象:

http://msdn.microsoft.com/en-us/library/a95009h1%28v=vs.110%29.aspx

当不再需要Free时,不要忘记致电GCHandle

object obj = ....;
GCHandle handle = GCHandle.Alloc(obj);
// ....
// object o is protected from garbage collection 
// ....
handle.Free();

请注意(http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.free%28v=vs.110%29.aspx

  

调用者必须确保对于给定的句柄,仅调用Free   一次。