先上两篇文章:
1)C#技术漫谈之垃圾回收机制(GC):http://kb.cnblogs.com/page/106720/
2)各种垃圾回收算法的通俗解释:http://jimoxiang.com/baiduspacearch/blog/blog/544606118.html
里面有不少有用的说明。顺带Google一下Java/C#垃圾回收等关键字,大致浏览,好习惯。
大道至简一下:
0)垃圾回收是回收内存堆上的对象。
1)垃圾回收可以分两步: 先识别垃圾,然后回收垃圾。
2)基本的垃圾回收算法:
引用计数——使用这个数来识别垃圾,识别出后回收。(引用数=0的对象为垃圾,回收他们。)
标记清除——标记即识别垃圾,清除即回收。(不可达的对象标记为垃圾,清除他们。)【可达图上的结点均不是垃圾,垃圾是零散结点。】
标记清除压缩——(多压缩一下,整理一下空间。)
复制——A段空间,B段空间。将非垃圾对象从A复制到B,然后清空A。
3)分代框架:
假设分为3代,如图示。每代有一段空间,设想 [1->2->3] 为一漏斗。
每次回收时,均回收1代。1代空间中的垃圾被收回,非垃圾对象落入2代。
隔一小段时间,回收一下2代。2代空间的垃圾被收回,非垃圾对象落入3代。
隔一大段时间,回收一下3代。3代空间的垃圾被收回,非垃圾对象保留。
4)理解事物本身语义,并尝试探究背后的原理。非宏观的具体垃圾回收的实现,需要源码(如Java Hotspot)。