无处不在的垃圾收集

食堂里的内存管理

      自从把武汉的工作辞掉以后,到现在都没有上班工作,玩了大概一个多月了。(哎,堕落啊!)期间回家了两次,就几天,在家呆得不长。在武汉找了一段时间的工作,怎么都没合适,就窝在学校里看看书,和NF(Honeybee Ning,最近一个学期改成了什么Chris Ning,英语屌就是没办法,我都快跟不上节奏)去逛逛街。那天和他在东三吃饭,一下想到手头上那本书《垃圾收集》。本来想早点写下来,可是一直有事,就搁置到现在。(一方面忙着搬东西回家,一方面准备到上海。好吧,2010我要暴走是真的,到现在我已经暴走了好几次。)

      下面开始扯淡堆空间分配和垃圾收集:

       前提假设:食堂的座位视为堆空间,有人坐了或放置了占座的东西则视为已分配,空位置视为未分配。占座坐人视为malloc,清空离开视为free。

     一般的堆空间使用谁使用谁分配谁释放,大概就是去食堂吃饭,你买饭占个位置吃饭(malloc),吃完了把餐具放到指定位置后离开(free)。

     什么是内存碎片呢?就是大家占位置很随意,你一个桌子,我一个桌子,虽然空了很多位置,但是一起来了几个人想坐同一个桌子不可能,已经没有了空桌子了。

    什么是特定大小内存池和伙伴机制了,就是指定一个区域是单人坐、双人坐、。。。,这样就能保证多人可以坐在一起。

   堆空间的分配的问题类推即可,我就不扯了。我的重点在垃圾收集。

  在学校有些食堂,你不用自己回收餐具,而是工作人员回收,想到了吧!这就是垃圾收集。我们只管占座吃饭(malloc),不管回收餐具(等同清理桌子free)。

 

先说说一般的引用计数型垃圾回收,这里有一个假设,可能不同一般堆空间引用计数为0时回收,假设一个位置可以承受一定数量餐具,比如如果一个人在一个空位置吃了以后,另外一个人也可以吃,当餐具达到两套(等同于零)就必须回收(由达到数目的人回收,这样不需要工作人员参与),这就和一般的引用计数回收机制类似。好处是实现比较简单,只需一定空间和时间计数即可,不需要专门的人员来参与;坏处比较明显了,最后一个人压力大。

 

标记-清理垃圾回收机制:你吃完了饭就直接走了,这里的标记可能不需要自己做,餐具占据了桌子就是标记垃圾,否则就是空闲空间,餐具回收人员定期清理那些餐具(就是把标记为垃圾的空间free后标记成空闲)。好处在于只需标记,不需要什么处理;坏处是可能需要等待清理人员清理餐具,可能没有位置,一般都是定期清理,计算机里面可能会出现没有位置时才清理,就是说没有位置吃饭了,你叫工作人员清理。显然不是对每个人都很及时。

 

节点复制垃圾回收机制:假设把食堂分成两部分,一部分大家吃饭,另一部分空缺。定期让吃饭那部分的人转移到空缺的部分,工作人员清理吃饭的那部分,这样两部分角色交换了,以后重复此过程。好处就是可以强制让大家按顺序坐,大家好找位置,选择多可不一定是好事,哈哈!坏处很明显,太浪费空间了,每次只能用一半。不过计算机里可以用虚拟内存啊!

 

至于渐进式,分代式的垃圾收集,和具体空间分配和安排,可以自己类比着作出。垃圾回收机制在现实生活中用的还是比较多,看来一切来源于生活啊,计算机界的垃圾回收机制也没有什么特殊之处,也都跳不出这些条条框框。至于那种垃圾回收机制更好,这个还要看具体场合。

最后扯淡归扯淡,

如果想要了解堆空间分配可以看操作系统相关书籍、malloc、free源码(版本众多,大都差不多,也许策略有些不同)或者CSAPP对应章节,至于垃圾收集,我觉得C++编程艺术中的引用计数还可以,当然首推还是垃圾收集这本书。想想去研究一下java的垃圾收集应该蛮不错,大学毕业时候去面试QQ时就没有回答对java具体是如何实现垃圾收集,当然我现在还是不知道它采用的什么策略,时间和精力太有限,什么都只搞了个一知半解,哎!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值