.NET Framework 的垃圾回收器管理应用程序的内存分配和释放
发表于:2024-11-26 作者:热门IT资讯网编辑
编辑最后更新 2024年11月26日,在C#中使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。 但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内
在C#中使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。 但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。 实例化新对象过程: 如图 首先、计算字段所需空间和对象所需空间。 对象所需空间包括两部分,同步块索引和类型对象指针。 再次、分配物理内存,新对象指针指象下一个可用内存区域。 垃圾回收过程 如下图 • 标记阶段:从根标记遍历到的对象。 • 压缩阶段:释放没有标记的对象内存,调整存在对象的位置 代(Generation)是CLR垃圾收集器的一种机制,它存在的惟一目的就是提高应用程序性能。 CLR初始化时,托管堆中没有任何对象,此时添加对象是,为第0代对象。 CLR支持3代内存 第0代对象预算容量为256k 第1代对象预算容量为2M 第2代对象预算容量为10M 第一次初始化是为第0代,当托管堆中第0代放满时,如果有新对象加入,则触发CLR 回收垃圾器把第0代中没有使用的对象清理掉,再把第0代的对象挪到第1代中,之后再把新对象添加托管堆的第0代中。
如果第0代放满而第1代没放满,CLR回收器只把第0代中不在使用的对象清理掉,而第1代中的不变,之后再把第0代挪入第1代,把新对象添加到第0代 当第1代和第1代也放满时,如果再有新对象加入,则触发CLR回收垃圾器把第0代和第1代中没有使用的对象清理掉,再把第0代的对象挪到第1代中,第1代的对象挪到第2代中,之后再把新对象添加托管堆的第0代中。 依次类推
如果第0代放满而第1代没放满,CLR回收器只把第0代中不在使用的对象清理掉,而第1代中的不变,之后再把第0代挪入第1代,把新对象添加到第0代 当第1代和第1代也放满时,如果再有新对象加入,则触发CLR回收垃圾器把第0代和第1代中没有使用的对象清理掉,再把第0代的对象挪到第1代中,第1代的对象挪到第2代中,之后再把新对象添加托管堆的第0代中。 依次类推