.NET内存管理

当我们说“内存管理”的时候,我们说的实际上就是“堆”的管理,堆栈的内存当然也是内存,但是堆栈的内存管理要简单很多。

我们前面说“堆和堆栈”的时候,说到“堆”实际上就是一个需要用户用完就清理的大房间,放在“堆”上的对象是可以长期存在的,直到这个对象被手动地清理。在.NET中,大致也是如此,除了一点:堆变成了“托管堆”,所谓托管堆,就是有人帮你管理的堆,既然有专人管理,那我们用完后,就丢在那里,让管理人员收拾吧。比如说,你在家里睡觉后,你自己得把被子叠好,而住了酒店,就有服务人员帮你叠被子,一个道理。自己叠被子的话,你可以一起床就把被子叠好,看起来清清爽爽,只是自己需要花点时间,费点力气。而让服务人员帮你叠被子呢,你可能很轻松,但你得等服务人员过来才可以,在服务人员来之前,你的房间可能就不是那么清爽了。

.NET中的垃圾回收实际上就是这么回事,对于托管对象来说,你用完后就可以扔在那里不管了,CLR会在合适的时候检查每个房间,看是不是需要帮你清理。有需要的时候,你也可以直接给服务人员打电话,主动召唤他们来清理你的房间。

那么什么是合适的时候?

我们的这个宾馆,为了管理方便,把客房分成3个等级:

· 经常打扫的 – 钟点房,数量较少,刚入住的客人一般都安排在这里;

· 打扫较少的-普通客房,数量稍多,这里住的客人都是从 钟点房转过来的,如果上次打扫钟点房的时候,钟点房的客人还要住,那就把这些客人重新安排到普通客房,把钟点房让出来;

· 打扫最少的-长期客房,数量最多,这里的客人是从普通客房转来的,如果上次打扫普通客房时,普通客房的客人还没离开,就把他们转到长期客房,把普通客房让出来。

宾馆为了节约成本,只有必要的时候才让服务人员去打扫房间,那什么时候是必要的时候呢?我们这个宾馆在客人离店的时候,并不打扫房间,在有新客人入住的时候,就去看钟点房有没有干净的空房间,要是有,就直接安排新客人入住;要是没有了,再去检查哪些房间已经不用了,把这些房间收拾清扫出来,这个时候,肯定还有一部分人住在钟点房的客人还需要继续住一段时间,宾馆方面就把这些客人转到普通客房,这下钟点房就都空了,然后把新客人就安排在第一间钟点房;

但是,如果有一天普通客房也住满了怎么办呢?这一天,又来了一位新客人,这个时候,钟点房已经没有干净的空房间了,于是宾馆方面就清理所有的钟点房,把还要继续住的客人请到普通客房,开始普通客房也没有干净的空房间了,于是宾馆方面就把普通客房也挨个检查一次,发现有客人实际上已经离开了,就清理出来,如果住在普通客房的客人还需要继续住段时间,就把他们再安排在长期客房,把普通客房让出来,然后就可以把从钟点房转来的客人安排入住到普通客房了,同时,把新客人安排到钟点房。

这就是.NET中垃圾回收的3个代龄。

为了自己方便,宾馆方面在安排客房的时候,总是按照顺序给客人安排,比如说,宾馆方面从1号到10号是钟点房,那第一个客人来的时候,就安排在1号房,第二个客人来了就安排在2号房,以此类推。(新对象在托管堆上的内存分配机制

如果又来新客人时,钟点房没有干净房间了,服务人员检查每个房间,发现1号客人还要继续住,2号客人不需要了,3号客人还住,4, 5号客人也不需要了,6,7,8,9,10号客人还住;这些还要住宿的客人就要被安排在普通客房,安排的时候呢,还是依次安排:1号客人住普通客房的1号,2号客房住转来的3号客人,4号客房住转来的6号客人,5号客房住转来的7号客人,等等。

原文地址:https://www.cnblogs.com/lbsong/p/3134906.html