Java 垃圾回收机制和算法

一些概念

堆指针

  • 堆指针指向第一个未被分配的内存,每当对象被被分配到堆上,堆指针就会指向下一个地址,这使得在堆上,不同对象都是更加紧密分布的,而不像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",清理整个堆,而在平时,只清理新生代。
  • 清理的时候,堆新生代使用复制算法,对老年代使用标记法。
分代收集

你可能感兴趣的:(Java 垃圾回收机制和算法)