堆又叫进程堆,是对进程而言的,栈又叫线程栈,是对线程,,
堆栈的资源是怎么分配的呢
引用类型:引用类型分配在堆上面,实例化的时候会在堆上面开辟一块空间存储当前类型的实例,,就是说引用类型保存的是地址,指向一块内存 引用类型分类:类{System.Object},自定义的类,字符串,接口,数组等 值类型:值类型分配在栈上面 值类型分类:int ,long ,float,char,bool,enum,struct等
垃圾回收(GC)
垃圾回收是针对堆而言的
静态资源不回收
什么样的对象需要垃圾回收?
托管资源和存在堆里的资源(值类型和引用类型)
托管资源:一般指被CLR控制的内存资源,这些资源的管理可以有CLR控制,例如程序中分配的对象,作用域的变量,大部分对象都是托管资源。
非托管资源:文件流,数据库连接等第三方资源,打印机,系统的窗口句柄都是非托管资源
垃圾回收的流程
- 标记阶段
- 计划阶段
- 重定位阶段
- 清扫阶段
- 压缩阶段
分代策略
如图:垃圾回收过程
第一次,遍历全部对象,找到没有引用过的,删除,剩下一代
第二次,遍历0代对象,找到没有引用的,删除,剩下升级到1代,日过空间还是不够,开始遍历1代,同样,没有引用的删除
如果还在被使用中,那么升级为2代,都不够才会检查2代
这样依次循环过滤,最终随着一段时间的运行,持续回收,从上往下,都是2代-1代-0代,2代是稳定的,只扫描0代或1代效率高。
什么时候才会GC
- 创建对象时会自动回收
- 操作系统报告内存不够时
- 还可以通过代码,GC.Collect()强制回收
- 程序退出(进程结束)
- 卸载AppDomain