温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

.NET Framework 的垃圾回收器管理应用程序的内存分配和释放

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

         如果第0代放满而第1代没放满,CLR回收器只把第0代中不在使用的对象清理掉,而第1代中的不变,之后再把第0代挪入第1代,把新对象添加到第0
 
         当第1代和第1代也放满时,如果再有新对象加入,则触发CLR回收垃圾器把第0代和第1代中没有使用的对象清理掉,再把第0代的对象挪到第1代中,第1代的对象挪到第2代中,之后再把新对象添加托管堆的第0代中。
依次类推
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI