一些概念
堆指针
- 堆指针指向第一个未被分配的内存,每当对象被被分配到堆上,堆指针就会指向下一个地址,这使得在堆上,不同对象都是更加紧密分布的,而不像C和C++那样随机分布。
老年代(Tenured Generation)和新生代(Young Generation)
- 生命周期长的叫做老年代,生命周期短的叫做新生代。
Full GC && Minor GC
- Full GC对整个堆进行回收,Minor GC只对新生代进行回收
Garbage Collection算法
标记-清除
“标记-清除”是一个经典的垃圾回收算法,
- Mark Term: 从根节点(GC Roots)出发,遍历所有引用,如果引用不为空,则给它引用的对象打上标记。
- Sweep Term: 从堆中清理没有被打标记的对象。
这个算法的缺点在于,它使得堆空间不连续,从而导致了低效率。
标记-清除
复制
- 把堆分成两份,先选其一存储对象。
- 当这一份满的时候,从GC Roots出发,找到所有存活的对象并且标记。
- 然后复制被标记的到另外一份堆中。
这种算法解决了堆空间不连续的问题,但当存在很多大的对象,或者持久不被删除的对象,就会做很多无用功。
复制
标记-压缩
- 这种算法是在"标记-清除"法的基础上进行改进的一种方法。
- 它把标记好的对象全部移动到一段,然后把另一端清空。
- 这种算法对于稳定的对象模型特别适用。但对于老年代的对象,会产生持续复制的问题。
标记-压缩
分代收集
- 堆内存被分为了老年代和新生代,当新生代中的堆被复制到了一定次数,它就会被复制到老年代。
- 老年代的对象一旦满了之后,就会引发"Full GC",清理整个堆,而在平时,只清理新生代。
- 清理的时候,堆新生代使用复制算法,对老年代使用标记法。
分代收集