之前的博文,已经介绍了标记清除法,复制算法,标记压缩等算法,每一种都有各自的优点和缺点,jvm垃圾回收采用分代算法,将内存空间根据对象特点分为几块,每块具有各自独特的优势和特点,根据垃圾回收对象的特性,使用不同的算法,提高效率。

新生代算法

一般来说,java虚拟就会尽可能(新生代内存足够的情况下)将新对象空间分配在新生代内存区域。新生代对象的特点是,很多对象很快就失去引用,等待被回收,能够存活下来的对象较少,因此,新生代比较适合复制算法。

新生代回收的频率很高,为了支持高频率的新生代回收,虚拟机采用一种叫做卡表(card table)的数据结构。卡表为一个比特位的集合,每一个比特位可以用来表示老年代的某一区域中的所有对象是否持有新生代对象的引用(不存在引用的对象即为回收对象)。这样在新生代GC时,就可以先扫描卡表,只有当卡表标记为1时,才需要扫描给定区域的老年对象,而卡表为0的所在区域老年对象,一定不含有新生代对象的引用。

老年代算法

老年代中,几乎所有对象都是经过几次垃圾回收后依然可以存活的,因此可以认为这些对象在一段时期内,甚至在应用程序的整个生命周期中,将是常驻内存的。因此老年代采用标记压缩或标记清除算法。

tip:这部分就不详细讲了,网上找到一篇讲的非常好的博文,点击这里传送门