C# 延迟对象的收集
根据一个合理可靠的来源,在C#中,只要GC能够证明某个对象将不再被使用,就可以收集该对象,即使对它的引用仍然存在。这可能会导致令人惊讶的早期定稿问题 如果您特别想将对象的收集延迟到某一点,那么最好的方法是什么?我们不能简单地保持对对象的引用,如果我们尝试简单地使用引用来停止GC,那么这样的操作可能会被优化掉。我们能做什么C# 延迟对象的收集,c#,java,garbage-collection,C#,Java,Garbage Collection,根据一个合理可靠的来源,在C#中,只要GC能够证明某个对象将不再被使用,就可以收集该对象,即使对它的引用仍然存在。这可能会导致令人惊讶的早期定稿问题 如果您特别想将对象的收集延迟到某一点,那么最好的方法是什么?我们不能简单地保持对对象的引用,如果我们尝试简单地使用引用来停止GC,那么这样的操作可能会被优化掉。我们能做什么 (这个问题的动机是在Java中,有人希望确保在WeakReference列表按其引用进行排序时不会收集WeakReference列表的引用。因此,在本例中,解释Java的行为与
(这个问题的动机是在Java中,有人希望确保在WeakReference列表按其引用进行排序时不会收集WeakReference列表的引用。因此,在本例中,解释Java的行为与C#的相似之处或不同之处,以及在本例中解决相应问题的方法。)java也会被理解。 可以考虑<代码> gCHANDLE。ALC/C >防止被管理对象被收集: 当不再需要
GCHandle
时,不要忘记呼叫Free
object obj = ....;
GCHandle handle = GCHandle.Alloc(obj);
// ....
// object o is protected from garbage collection
// ....
handle.Free();
注意()
调用者必须确保对于给定句柄,仅调用Free
一次
static
variables…?不太确定,但在某些情况下使用析构函数可能会有所帮助?据我所知,它会延迟收集对象,因为它希望析构函数完成此工作。这看起来很像我正在寻找的,但我不确定对象必须只有可blittable成员的限制是否是一个问题。嗯……我想这样做nk限制用于固定的句柄,请参见。但要创建固定的句柄,请使用另一个重载:GCHandle.Alloc(object,GCHandleType)
。SimpleGCHandle.Alloc(object)
使用GCHandleType==Normal
。