垃圾回收器是如何工作的
要理解垃圾回收器是如何工作的,你就得先了解各种设计方案的原理。Reference counting是一种简单的,但却比较慢的方案。它的意思是,每个对象都要包含一个reference计数器,每次有reference连接到这个对象的时候,这个计数器就会做递增。每次有reference离开作用域,或者是设成null的时候这个计数器就会做递减。这样,管理reference计数器就成了程序运行期间的一项不大,但却无法摆脱的负担了。垃圾回收器扫描一遍所有的对象,找到reference计数器为零的对象,释放其内存。但是这种方案有个缺点,那就是如果一堆垃圾对象相互引用并且连成一个环的话,那它们的reference计数器就不会是零了。要让垃圾回收器找出这种自我引用的对象,需要花更多的力气。Reference计数通常被用于解释垃圾回收的技术,但是似乎没有哪种JVM采纳了这种设计。
在一些高效的设计方案里,垃圾回收不是基于reference计数的。相反,其设计思想是,所有没死的对象都应该能最终找到它在栈,或者在静态存储区里的reference。这个关系链可以跨好几层对象。这样,如果从栈和静态存储区开始,查遍所有的reference,你能找出全部的还活着的对象。找到一个reference之后,你还得跟到它所指对象里去,然后跟着对象里面的reference找出所指的对象,以此类推,直到你访遍整个网。你所路过的每个对象应该都是活着的。注意,现在就没有自我引用的对象组的问题了——它们干脆就找不着了,因此自动就成了垃圾了。