.net GC如何清理结构体?

eufgjt7s  于 2023-02-26  发布在  .NET
关注(0)|答案(2)|浏览(122)

我认为GC可能会区别对待引用类型和值类型。
GC会收集引用类型,如果没有人引用它。GC什么时候会收集像struct这样的值类型?我的struct不小。我希望尽早收集它。通过分析器软件,我看到struct有很大的积累,是主要的内存消耗者。

ruyhziif

ruyhziif1#

如果一个结构体是示例/静态字段,或者是另一个对象的一部分,或者是装箱的,或者是在数组中,那么它将只在托管堆中(即可以进行垃圾收集的地方)1。它在托管堆中从来不是“裸露的”a-你可以得到的最接近的是装箱的值。
如果你有一个很大的结构体,这是你的第一个问题。你为什么要创建这样的东西呢?结构体应该总是很小的(经验法则通常是32字节),否则每次你把它用作方法参数或把它赋给另一个变量时,你最终都会复制它。
你考虑过用类来代替吗?
[1]正如Eric Lippert喜欢指出的,the stack is an implementation detail。此外,在某些情况下,局部变量最终会成为自动生成类中的字段......但我认为这与这个问题有点无关。

vm0i2vca

vm0i2vca2#

结构类型是值类型,继承自System. ValueType。值类型变量在当前线程的堆栈上分配(不在堆上)。内存不在托管堆上分配。内存在堆栈上分配,并在值类型变量超出范围时自动释放。但是,如果要对值类型变量进行装箱,则会在堆上为变量的 Package 和变量'的字段被复制到 Package 器。如果你的值类型变量大于85 KB,它的 Package 器将被放置在大对象堆(洛)中。LOH对象是长期存在的-它们属于Gen 2。

相关问题