引用计数法
每个对象都存在一个引用计数器。在被引用的时候,都会让计数器+1。当引用消失时,计数器-1。当GC时,引用为计数器为0的对象就是垃圾对象没有被使用,即被回收。
缺点:如果两个对象相互引用,则无法被回收。类似于死锁。我拉着你,你拉着我,我们永远有引用。
复制算法
存在于年轻代中,当年轻代发生GC时,开始销毁eden区、幸存者0区(简称S0)和幸存者1区(S1)的对象。存活下来的对象会被打包到一起。一起分派到S0或S1中。S0与S1内存空间大小相等,每次都只能往一个区域分派,然后清空另一个区域。例如这次把存活对象放到了S0,那么S1的数据就会被清空。下次反之。一直如此的复制,交换。每次交换后,活下来的对象年龄+1。到了16次,送往养老区。
优点:由于对象全体打包完一起放到一块区域,没有碎片,且性能较好。
缺点:浪费空间,永远有一个S0或S1空着,并且假设对象的存活率较大(例如有很多静态对象,无法回收),每次复制都是将那堆对象在翻来覆去的的复制。这时候效率就不高了。这里其实很像链表与数组的区别。数组有着连续的空间,十分整齐的排列。但是需要占用一块完整的空间。而链表是可以分散开的,有着前引用与后引用去寻址。
标记清除法
标记压缩