GC如何清理结构?

时间:2010-07-21 20:14:15

标签: c# .net

我认为GC可能会以不同方式处理引用类型和值类型。

如果没有人引用它,GC将收集引用类型。 GC会收集类似struct的值类型吗?我的结构不小。我希望尽可能早地收集它。使用分析器软件,我看到结构有很大的积累,并且是主要的内存消耗。

2 个答案:

答案 0 :(得分:6)

如果一个struct是一个实例/静态字段,或者是另一个对象的一部分,或者是盒装的,或者是一个数组 1 ,那么它只能在托管堆中(即它可以被垃圾收集) SUP>。它在托管堆中永远不会“裸露” - 你能得到的最接近的是一个盒装值。

如果你有一个大结构,这是你的第一个问题。你为什么要创造这样的东西?结构应该几乎总是很小(经验法则通常是32个字节),否则每次将它用作方法参数或将其分配给另一个变量时,你最终都会复制它。

您是否考虑过使用课程?


1 正如Eric Lippert喜欢指出的那样,the stack is an implementation detail。此外,在某些情况下,局部变量最终会成为自动生成类中的字段......但我认为这与此问题有些无关。

答案 1 :(得分:1)

结构类型是值类型,并且继承自System.ValueType。值类型变量在当前线程的堆栈上分配(不在堆上)。内存未在托管堆上分配。它在堆栈上分配,并在值类型变量超出范围时自动释放。但是如果你正在进行值类型变量的装箱,则在堆上为变量的包装器分配内存,并将变量的字段复制到包装器中。如果你的value-type变量大于85KB,它的包装器将放在Large Object Heap(LOH)中。 LOH对象长寿 - 它们属于Gen2。