这是篇读书笔记,来自《Thinking In Java 4TH》第五章“Initialization & Cleanup”的“How a garbage collector works”这一小节(具体详见P178),为了给自己加深印象,做个笔记。由于这本书是2007出版的,所以这里的垃圾回收算法主要是学习参考用,不是对当前最新JVM的GC学习。
我们很容易认为Java在堆上为所有对象分配空间是一件成本很高的事情。然而,GC在增加对象创建速度上有着重要影响,JVM的回收机制让堆对象的创建和其他语言在栈上创建对象差不多一样快。Java的Heap像传送带,每次分配一个新对象,“传送带”就往前移动,这意味着对象空间的分配能快速标记,每次堆的指针只是简单的向前移动。如果仅仅是“传送带”,创建大量对象时就会出OOM(out of memory),其中机制就是garbage collector,GC会收集heap的垃圾并使堆中的所有对象紧凑,所以你能有效的移动“heap pointer”,保持堆指针尽可能地离“传送带”的头部近。这让堆空间的快速分配成为可能,同时让用户看起来堆空间是无限的。为了更好地理解java,了解GC的机制是很有帮助的。
一.reference counting--引用计数法