当我们分析内存堆时,我们通常会遇到以下4种类型的GC句柄:
弱: - 弱GC句柄不会阻止它对应的实例被垃圾收集。 Example, used by the System.WeakReference class instances
。
正常: - 普通的GC句柄可防止相应的实例被垃圾回收。Example, used by the instances of strong references
。
RefCounted: - 引用计数GC句柄由运行时内部使用,example, when dealing with COM interfaces.
固定: - 为什么我们需要这种GC手柄?是否只是为了避免该实例在内存中的移动或is there any other notion behind this? I want to know the notion behind Pinned GC handle(with an example).
为Itay的回答编辑: - 我有一个非空数组 - DiffCell [] [] ,它绑定到数据网格中WPF。当我关闭存在此数据网格的窗口时,在堆上我看到固定GC句柄通过 DiffCell 数组> object [] (参见快照)。 I am not using any unsafe code. I am just setting ItemsSource of data grid to null before closing that window. So my question is who does pin this array on heap and why?
答案 0 :(得分:7)
如果我们使用指针,我们需要这个
想象一下,你声明了一个指向内存位置的指针而你没有插入。
GC有时会将内存块移动到其他位置,因此指针将无效。
例如:
public unsafe void DoSomething(byte b)
{
byte * bp = &b;
}
这将无法编译,因为您没有修复保存该字节的内存位置 为了固定它你可以使用:
public unsafe void DoSomething(byte b)
{
fixed(byte * bp = &b)
{
//do something
}
}
答案 1 :(得分:3)