类比:
自己去拿盘子 = 申请内存
用完之后自已放到残渣中 = 手动释放
阿姨来回收 = 自动回收(比如垃圾太多了,新客户来了)
自己叫阿姨来回收 = 手动调用自动回收
CLR的一个核心功能–垃圾回收
垃圾回收的目的:提高内存利用率
垃圾回收器,只回收托管堆中内存资源,不回收其他资源(数据库连接、文件句柄、网络端口)
什么样的对象才会被回收?
(1) 没有变量引用的变量,表示可以被回收了
什么时候回收
(1) 不确定,当程序需要新内存的时候开始执行回收
(2) GC.Collect()手动调用回收。不建议使用,垃圾回收时会暂停一下(非常短暂)
垃圾回收器中"代"的概念:
(1) 共3代:第0代,第1代,第2代
GC.Collect(0);//回收第0代
(2) 各代的回收频率:第0代最高,其次第1代,再次第2代。也就是说越老的对象生存几率越大
第0代,第1代,第2代指定固定大小的空间
创建对象时默认往前代(第0代)放入,如果第0代没有空间了,开始准备垃圾回收,
其中第0代有些对象因为还有引用所以释放不了,就往后代(第1代)放。这时候第0代就没有东西了。这个时候新对象就放入时就依然进入第0代,如果第0代又满了的话,就开始垃圾回收第0代,如果到后面第1代满了,开始回收第1代,第1代存活下来的就放到第2代了。如果到后面第2代满了且都活着,那么这个时候第1代因为满了还有一些释放不了的需要放到第2代因为第2代空间满了进不去。这个时候会对每代开始尝试扩容。如果最后扩容不了,开始抛异常
net中垃圾回收机制:mark-and-compact(标记和压缩),一开始假设所有对象都是垃圾
除了内存资源外其他资源怎么办?或则Dispose