Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 延迟对象的收集_C#_Java_Garbage Collection - Fatal编程技术网

C# 延迟对象的收集

C# 延迟对象的收集,c#,java,garbage-collection,C#,Java,Garbage Collection,根据一个合理可靠的来源,在C#中,只要GC能够证明某个对象将不再被使用,就可以收集该对象,即使对它的引用仍然存在。这可能会导致令人惊讶的早期定稿问题 如果您特别想将对象的收集延迟到某一点,那么最好的方法是什么?我们不能简单地保持对对象的引用,如果我们尝试简单地使用引用来停止GC,那么这样的操作可能会被优化掉。我们能做什么 (这个问题的动机是在Java中,有人希望确保在WeakReference列表按其引用进行排序时不会收集WeakReference列表的引用。因此,在本例中,解释Java的行为与

根据一个合理可靠的来源,在C#中,只要GC能够证明某个对象将不再被使用,就可以收集该对象,即使对它的引用仍然存在。这可能会导致令人惊讶的早期定稿问题

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


(这个问题的动机是在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)
。Simple
GCHandle.Alloc(object)
使用
GCHandleType==Normal