从微软CLR视角看.net用户自定义类型
下面的图显示了值类型和引用类型实例的存储配置。
实例化
在实例化过程中,一个值类型的所有方面都实例为0(值类型群组)或者是null(引用类型群组)。观念上,当使用新的输入员实例化值类型时,就要使用值类型实例或者访问这个值类型.但是在技术上,在值类型实例的声明过程中,当这些群组已经被CLR零化时,就不需要值类型实例。但是只有当值类型实例群组已经明确建立到某些值时,或者通过使用新输入员已经建立了值类型实例时,一些语言(例如:C#)才会允许程序使用或者访问值类型实例群组。这一行为是为了给值类型节约额外的构造器调用,这些值类型已经大量地应用宰了在应用程序里。值类型可以由参数构造器,可以明确调用构造器来船舰值类型实例。在这种实例下,参数构造器要实例化值类型的所有区域。
另一方面,要使用新的操作器来分配引用类型,而且必有一个缺省构造者或参数构造者。当建立引用类型的实例时,CLR首先将会实例化引用类型的所有群组,然后才会创造缺省或者参量构造器,缺省或者参量构造器是建立在新的输入员指定的构造器的基础上。
变量和GC Roots
值类型的变量是迭式存储器上值类型实例地址的直接表达。
一个值类型实例的一个引用变量被命名为托管指针,而且它是迭式存储器上值类型实例的起始地址。
一个引用类型 (统一数据传送, 数组, 字符串, 托管类型和接口 类型变量)的变量是垃圾回收机制上建造的引用类型实例的指针。
CPU寄存器包括托管指针或者对象引用。
应用程序域控制代码表包括垃圾回收机制,垃圾回收机制是存储器里连接在引用类型上面的指针。这些控制代码表也包括静态值类型实例的托管指针,以及静态引用类型实例的对象引用。
线程本地存储区包括对象引用
FReachable Queue包括这个引用类型的对象引用,这些引用类型没有被上面任何一个变量类型引用,并且最终决定未决的方法调用。
CLR的垃圾回收也称为GC roots,在碎片帐集中,使用上面的变量来追踪目标引用。因为在上面任何一个变量类型中没有对象引用,位于垃圾回收器堆中的任何引用类型实例都被认为是碎片帐集的代替品,并从垃圾回收器堆中删除。如果被删除的引用类型实例执行最终决定方法,对象引用就会被一个单独的Finalizer thread放在FReachable Queue上,用于调用完成方法。一旦终结器线程完成了对象引用上的完成方法调用,相应的引用类型实例就会从垃圾回收器堆中删除。
0
相关文章