时间:2016-04-14 16:00
地点:新大楼 903
看似无限的内存
造成内存溢出的原因可能有:
- 无线递归
- 创建的对象无法销毁
没有GC的时候:
在C和C++中,内存空间是人手动进行管理的
malloc(),free()
GC是什么
将不要的对象进行回收
Carbage Collector,以应用程序的root为基础,遍历在Heap上动态分配的对象,通过识别它们是否被引用来确定是否要回收
GC的几种算法
标记清楚方式
1.遍历
2.有引用的标记一下
3.遍历没有标记到的对象并删除
缺点:只有少部分活的对象时,效率低
复制收集方式
1.遍历
2.把活的对象放到新的空间里
3.一次性把旧空间的所有对象都清除
典型的拿空间换时间。
缺点:大部分都是活的对象时,效率低
引用计数方式
1.创建对象的时候就给每一个对象标记一下有多少个其他对象对它进行了引用
2.当引用发生变化时更新引用计数
3.清除引用计数为0的对象
缺点:循环引用的对象永远清除不掉
.NET中的GC
内存管理
值类型&引用类型
堆&栈
扩展阅读:Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing
托管与非托管
托管:.NET自动回收,无需人手动参与
非托管:文件操作、网络连接、数据连接等需要手动回收
分代回收
- 基于标记压缩法
- .NET将垃圾分为Gen0/Gen1/Gen2三代进行回收
- 大致讲,.NET应用运行期间2代、1代和0代GC的频率大致为1:10:100
GC类提供了GC.Collect()方法,但应避免调用任何回收方法,原因:在垃圾回收之前,它会挂起当前正在执行的线程,导致性能降低
GC不是实时的
推荐书目《代码的未来》
PS:书香苏州上竟然没有这本书,宝宝不开森~~~