zoukankan      html  css  js  c++  java
  • .NET的垃圾回收机制

    .NET的垃圾回收机制:

    CLR管理内存的区域主要有三块:

    一:

    线程的堆栈 ,用于分配值类型实例。堆栈主要有操作系统管理,不受垃圾收集器的控制,当值类型实例所在的方法结束时,其存储单位自动释放。栈的执行效率高,但存储容量有限。

    二:

    GC堆,用于分配小对象实例。如果引用类型对象的实例小于85000字节,实例将被分配在GC堆上。当有内存分配或者回收时,垃圾收集器会对GC对进行压缩。

    三:

    LOH(Large object heap),用于分配大对象实例。LOH堆不会被压缩,而且只有在完全GC回收时才会被回收,这种设计方案是对垃圾回收性能的优化考虑。

    GC如何判断某个对象为垃圾

    每个应用程序有一组根(指针),根指向托管堆中的存储位置,由 JIT编译器和 CLR运行时维护根指针列表,主要包括全局变量、静态变量、局部变量和寄存器指针等。

    当垃圾收集器启动时,它假设所有对象都是可回收的垃圾,并开始遍历所有的根,将根引用的对象标记为可达对象添加到可达对象图中,在遍历过程 中,如果根引用的对象还引用着其他对象,则该对象也被添加到可达对象图中,依次类推,垃圾收集器通过根列表的递归遍历,将能找到所有可达对象,并形成一个 可达对象图。同时那些不可达对象则被认为是可回收对象,垃圾收集器接着运行垃圾收集进程来释放垃圾对象的内存空间。

    垃圾收集器何时启动:

    1)内存不足溢出时,更确切地应该说是第 0代对象充满时。

    2)调用 GC.Collect 方法强制执行垃圾回收。

    3Windows报告内存不足时,CLR 将强制执行垃圾回收。

    4CLR 卸载AppDomain 时,GC将对所有代龄的对象执行垃圾回收。

    5)其他情况,例如物理内存不足,超出短期存活代的内存段门限,运行主机拒绝分配内存

  • 相关阅读:
    统计一个字符串中字母、空格和数字的个数
    java 将一个数组中的值按逆序重新存放,例如,原来顺序为:9,5,7,4,8,要求改为:8,4,7, 5,9。
    java判断一个数是否为素数[转]
    Set集合
    List&ArrayList&LinkedList
    java_异常
    内部类&匿名内部类
    多态&抽象类&接口
    数组排序和字符串
    Java笔记_数据类型和运算符
  • 原文地址:https://www.cnblogs.com/zhangleinihao/p/4129151.html
Copyright © 2011-2022 走看看