【问题标题】:Delaying collection of an object延迟对象的收集
【发布时间】:2014-02-14 09:12:32
【问题描述】:

根据一个相当可靠的来源this answer,在 C# 中,只要 GC 可以证明它不再被使用,就可以收集对象,即使对它的引用仍然存在。这可能会导致令人惊讶的提前完成问题。

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

(这个问题的动机是 Java 中的an older question,其中有人希望确保在 WeakReferences 被其所指对象排序时不会收集 WeakReferences 列表的所指对象。因此,解释如何在这种情况下,Java 的行为与 C# 的行为相似或不同,如果能解决 Java 中的相应问题,我们也将不胜感激。)

【问题讨论】:

  • static 变量.... ?
  • 不太确定,但在某些情况下使用析构函数可能会有所帮助?据我所知,它会延迟收集对象,因为它希望析构函数来完成这项工作。

标签: c# java garbage-collection


【解决方案1】:

您可以考虑使用GCHandle.Alloc 来防止托管对象被收集:

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

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

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 一次。

【讨论】:

  • 这看起来很像我正在寻找的东西,但我不确定对象必须只有 blittable 成员的限制是否有问题。
  • 嗯...我认为限制是针对Pinned 句柄,请参阅msdn.microsoft.com/en-us/library/83y4ak54%28v=vs.110%29.aspx。但是要创建Pinned 句柄,需要使用另一个重载:GCHandle.Alloc(object, GCHandleType)。简单的GCHandle.Alloc(object) 使用GCHandleType == Normal。
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多