C# 内存管理
资源的一个用法是本地化,另一个主体是使用托管和非托管的资源--存储在托管或者本机堆中的对象。尽管垃圾收集器释放存储在托管堆中的托管对象,但不释放本地堆中的对象。必须由开发人员自己释放它们。
使用托管环境时,很容易被误导,注意不到内存管理。什么是大小对象堆,以及什么数据类型存储在堆栈上是非常有益的。
C#编程的优点是程序员不需要担心具体的内存管理。垃圾回收器会自动处理所有的内存清理工作。用户可以得到像C++语言那样的效率。虽然不必手动管理内存,但仍然需要理解后台发生的事情,理解程序在后台如何处理内存有助于提高应用程序的速度与性能。
在处理器的虚拟内存中,有一个区域称为栈,栈存储不是对象成员的值数据类型。另外在调用一个方法时,也使用栈存储传递给方法的所有参数的副本。为了理解栈的工作原理,需要注意在C#中的变量作用域。如果变量a在变量b之前进入作用域。b就会首先超出作用域。
引用数据类型
尽管栈有非常高的性能,但它还没有灵活到可以用于所有的变量。变量的生存期必须嵌套,在许多情况下,这种要求都过于苛刻。通常我们希望使用一个方法分配内存,来存储一些数据,并在方法退出后的很长一段时间内数据仍然是可用的。是钥匙new运算符来请求的存储空间,就存在这种可能,对于所有应用的数据类型。此时就要使用托管堆。
托管堆是处理器的可用内存中的另一个内存区域。
在垃圾回收器运行时,它会从堆中删除不再引用的所有对象。垃圾回收器在引用的根表中找到所有引用的对象。接着在引用的对象树中查找。在完成删除操作后,堆会立即把对象分散开来,与已释放的内存混合在一起。
人不能停止前进