Net CoreCLR 堆栈 GC 垃圾回收

 

堆又叫进程堆,是对进程而言的,栈又叫线程栈,是对线程,,

堆栈的资源是怎么分配的呢

引用类型:引用类型分配在堆上面,实例化的时候会在堆上面开辟一块空间存储当前类型的实例,,就是说引用类型保存的是地址,指向一块内存
引用类型分类:类{System.Object},自定义的类,字符串,接口,数组等


值类型:值类型分配在栈上面 
值类型分类:int ,long ,float,char,bool,enum,struct等
 

垃圾回收(GC)

垃圾回收是针对堆而言的
静态资源不回收

什么样的对象需要垃圾回收?

托管资源和存在堆里的资源(值类型和引用类型)

托管资源:一般指被CLR控制的内存资源,这些资源的管理可以有CLR控制,例如程序中分配的对象,作用域的变量,大部分对象都是托管资源。

非托管资源:文件流,数据库连接等第三方资源,打印机,系统的窗口句柄都是非托管资源

垃圾回收的流程

  1. 标记阶段
  2. 计划阶段
  3. 重定位阶段
  4. 清扫阶段
  5. 压缩阶段

分代策略

如图:垃圾回收过程

第一次,遍历全部对象,找到没有引用过的,删除,剩下一代

第二次,遍历0代对象,找到没有引用的,删除,剩下升级到1代,日过空间还是不够,开始遍历1代,同样,没有引用的删除

如果还在被使用中,那么升级为2代,都不够才会检查2代

这样依次循环过滤,最终随着一段时间的运行,持续回收,从上往下,都是2代-1代-0代,2代是稳定的,只扫描0代或1代效率高。

什么时候才会GC

  1. 创建对象时会自动回收
  2. 操作系统报告内存不够时
  3. 还可以通过代码,GC.Collect()强制回收
  4. 程序退出(进程结束)
  5. 卸载AppDomain
原文地址:https://www.cnblogs.com/wangmaolin/p/13958154.html