类型对象会被垃圾回收吗?
Will the Type Object be garbage collected?
比如我有一个ClassA和一个方法f.
Class B
{
void aMethod(){}
}
void f()
{
var a= new B();
a.aMethod();
}
当执行一个方法时,CLR会首先在堆上初始化基本类型对象。因此,在 f 中的第一条语句执行之前,将在堆上分配并初始化一个对象 B Type Object
。
所以f执行完后,B Type Object
会被垃圾回收吗?(B Type Object
除了B
实例,还有其他特殊的root
吗?)
为澄清起见,B Type Object
指的是表示 B
类型
的 System.Type
对象
我正在阅读本书的第 4 章 CLR via C#
。
f()
方法完成后,在该方法中创建的 B
对象的实例变得 符合条件 可以收集。这并不一定意味着它会立即被收集。每当 GC 发生 运行 时,它就会被收集,这可能是也可能不是方法完成时。
但这听起来也像是您在谈论元数据,另一种用于描述对象类型的对象实例,例如 Type
类型。
因此我们需要讨论两件事:Type
实例和元数据。没有 Type
实例只是因为您第一次调用了 f()
方法并使用了 B
对象。每种类型都有 是 元数据,但它本身通常并不存在于堆上,当然也不仅仅是因为您第一次调用 f()
才分配的。相反,特定程序集的所有元数据都位于程序集目标代码中的 table 中。整个 table 都加载了程序集。您可以在这里阅读更多相关信息:
这很令人困惑,因为还有一个 Object
类型,这在 .Net 中意味着完全不同的东西,并且在问题中使用 Object
这个词更让人困惑而不是帮助。但是 .Net 中的 Object
类型不会以任何特殊方式自动植根。当实例不再可用时,它们就会像其他任何东西一样有资格被收集。
比如我有一个ClassA和一个方法f.
Class B
{
void aMethod(){}
}
void f()
{
var a= new B();
a.aMethod();
}
当执行一个方法时,CLR会首先在堆上初始化基本类型对象。因此,在 f 中的第一条语句执行之前,将在堆上分配并初始化一个对象 B Type Object
。
所以f执行完后,B Type Object
会被垃圾回收吗?(B Type Object
除了B
实例,还有其他特殊的root
吗?)
为澄清起见,B Type Object
指的是表示 B
类型
System.Type
对象
我正在阅读本书的第 4 章 CLR via C#
。
f()
方法完成后,在该方法中创建的 B
对象的实例变得 符合条件 可以收集。这并不一定意味着它会立即被收集。每当 GC 发生 运行 时,它就会被收集,这可能是也可能不是方法完成时。
但这听起来也像是您在谈论元数据,另一种用于描述对象类型的对象实例,例如 Type
类型。
因此我们需要讨论两件事:Type
实例和元数据。没有 Type
实例只是因为您第一次调用了 f()
方法并使用了 B
对象。每种类型都有 是 元数据,但它本身通常并不存在于堆上,当然也不仅仅是因为您第一次调用 f()
才分配的。相反,特定程序集的所有元数据都位于程序集目标代码中的 table 中。整个 table 都加载了程序集。您可以在这里阅读更多相关信息:
这很令人困惑,因为还有一个 Object
类型,这在 .Net 中意味着完全不同的东西,并且在问题中使用 Object
这个词更让人困惑而不是帮助。但是 .Net 中的 Object
类型不会以任何特殊方式自动植根。当实例不再可用时,它们就会像其他任何东西一样有资格被收集。