zoukankan      html  css  js  c++  java
  • .NET Framework 的垃圾回收器管理应用程序的内存分配和释放

    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代中。

    依次类推

     

  • 相关阅读:
    【LeetCode】336.回文对(前缀树,散列,暴力三种方法,java实现)
    Python爬虫入门教程 72-100 分布式爬虫初步解析-配好环境肝完一半
    net.ipv4.tcp_max_tw_buckets=10
    tcp_fin_timeout
    程序停掉close_wait立马回收
    net.ipv4.tcp_tw_reuse = 1 重用time_wait
    做了3年数据报表却毫无进步?看过这3种方法的人,都被领导重视了
    【LeetCode】212.单词搜索 II (前缀树两种方法实现)
    Linux C/C++编程之(十三)系统IO函数
    《java入门第一季》之面向对象匿名内部类面试题
  • 原文地址:https://www.cnblogs.com/zzuhjf/p/2121896.html
Copyright © 2011-2022 走看看