一直在园子里都是瞻仰各位大牛,没有留下过一点痕迹。借用糗百中的一句话“光看不发掉人品啊”。从劳动节到现在菜鸟我一直跟智齿作斗争。来上面攒点人品,顺便培养写东西这种文艺修养。哈哈哈哈。。。
垃圾是怎么产生的呢?
首先要明确一个问题,什么事垃圾呢?个人窃以为就是:不再被需求的资源。之所以这么说,是觉得这个“垃圾资源”当初也是为某个程序立下汗马功劳的,在后面也会讲到他自己不能决定自己的命运,人家需要就创建他,不需要就摧毁它。 在面向对象的环境中,每个类型都代表一种供程序使用的资源。比如文件、内存、网络、DB。这些资源也是经过一个或短或长的人生之后沦落为“废物”的。
资源的产生:调用IL指令newobj,为代表资源的类型分配内存。在C#中使用new操作符,编译器就会自动生成该指令。这个指令都干点什么呢?????
a): 计算类型及其所有基类型的字段需要的字节数。很好理解,因为造出来一个多大的东西也好给弄房子的时候知道弄多大的房子啊。
b):加上对象的开销所需的自己数。每个对象都有两个开销的字段:一个是类型对象指针和一个同步快索引。
c):CLR检查保留区域是否能够提供分配对象所需的字节数,如有必要就提交存储。如果托管堆有足够的可用空间,对象会被写入到托管堆中。写入的位置为
c后面的位置,C#语言调用IL的newobj返回的地址就是C后面的地址。ABC为堆上已经存在的对象。
A | B | C |
资源安家:初始化内存,设置资源的初始状态,使资源可用。类型的实例构造器设置该初始状态。这就好比在xx省xx市xx大街xx栋xx单元xx室给资源安了一个家,这样程序就能在这个地址找到资源。
资源实现价值:已经知道资源家在哪了就可以给他邮寄一封信啊,或者买点礼物邮寄过去。或者去拜访一下它啊。
资源被清理:当资源已经不被需要了,那么就摧毁资源的状态对其就行清理。
释放被强拆了:释放内存,就是把资源的房子给拆了。就是里面都没人了,还留着干什么。
2. 垃圾回收机制应运而生。
看似顺理成章的事情,却经常导致程序发生错误。
比如说资源被清理的,可是当初给他的房子没有收回。也没人住了啊。。或者资源被清理了,房子被摧毁了,还去他家去做客,肯定找不到人啊。
如果这些问题都让D来管理那么D哪还有那么多精力干大事啊。所以就出现了CG。这个CG就相当于GC(垃圾回收机制)。这个比喻不恰当。可是有想不出好的。
接下来是CLR的垃圾回收算法。
参考:CLR VIA C#
菜鸟浅见,勿喷。。。