C#
有一个统一的类型系统,其中所有类型,包括原始类型都从类型继承 object
。
Java
它的所有类也都继承自object
type.
引用自Thinking in java
单根层次结构使垃圾收集器的实现变得更加容易
是否unified type system
或single rooted hierarchy
帮助进行垃圾收集,如果是这样,如何?
C#
有一个统一的类型系统,其中所有类型,包括原始类型都从类型继承 object
。
Java
它的所有类也都继承自object
type.
引用自Thinking in java
单根层次结构使垃圾收集器的实现变得更加容易
是否unified type system
或single rooted hierarchy
帮助进行垃圾收集,如果是这样,如何?
我认为主要原因是它有助于确保所有对象都有一个Finalize
方法,从而实现与 GC 的自动兼容。
此方法在对象变得不可访问后自动调用,除非该对象已通过调用 GC.SuppressFinalize 免除终结。在应用程序域关闭期间,会自动对未免于完成的对象调用 Finalize,即使是那些仍可访问的对象。Finalize 只在给定实例上自动调用一次,除非使用诸如 GC.ReRegisterForFinalize 和 GC.SuppressFinalize 之类的机制重新注册对象并且随后没有调用 GC.SuppressFinalize。
好吧,你有一个问题 - 你认为它有帮助,因为它使垃圾收集器更好。
IT 有帮助,因为它可以避免(!)垃圾收集。
STRUCTS 在 C# 中 - 都是原始类型,如 int 等,但也是您自己创建的所有类型 - 除非它们被装箱(分配给一个对象,然后它们得到一个包装器),否则它们不会被垃圾收集。
这意味着我可以使像 Point 这样的元素(将 x 和 y 作为整数)在垃圾收集器中具有零开销,因为它不是垃圾收集的。
基本上,在 Java 中原语是“编译器黑客”,在 C# 中原语是“对象层次结构的另一面”,它是结构,而不是类。
因此,统一类型 System 并不能通过统一来帮助垃圾收集器,它通过不创建首先被垃圾收集的对象来帮助垃圾收集器。
这也导致 - 通过通用支持 - 高效的集合,不必将每个项目都装箱。这就是在 Java 中事情变得令人讨厌的地方,因为运行时在字节码级别没有泛型的概念,所以所有东西都是“对象”,而在 C# 中,列表是字节码中的一种单独类型的列表并经过优化。
垃圾收集器唯一需要的是能够识别对象的大小以及对象中的引用在哪里(例如从类型)
有一种方法来确定这一点,可以使它更简单。
.NET 中统一的是定义结构类型和类类型的方法。结构定义
struct IntPair
{
public Int32 V1,V2;
}
定义了两件事。IntPair
它定义了一个派生自的堆对象类型IntPair
,而后者又派生自Object
,并且将表现得像一个对象,因为它是一个对象。它还定义了一个存储位置类型IntPair
,它的行为就像一对用胶带粘在一起的整数,因为它是一对用胶带粘在一起的整数。虽然堆对象类型派生自Object
,但存储位置类型不是对象,也没有对象。它拥有两个整数——仅此而已;一点也不差。
统一类型系统的好处是它使垃圾收集器更容易处理包含引用类型字段的值类型。GC 必须能够 100% 确定地识别存在于整个 Universe 中的所有可访问引用,包括作为值类型的字段的引用。如果类类型和值类型定义使用相同的数据结构,则确定类对象大小和每个字段的偏移量的过程也可以用于确定结构的大小及其每个嵌套字段的偏移量. 不碰巧包含嵌套引用的值类型使用相同的数据结构不会特别有利于 GC,但也不会损害任何东西。