①引用计数
对象增加一个引用时,引用数+1。减少一个时,引用数-1。当进行垃圾回收时,只回收引用数为0的对象。面对互相引用无解,方法比较老,基本弃用
②标记+清除
从根节点遍历标记对象,然后遍历整个堆,清除没有标记的对象。缺点:运行效率不高,产生了内存碎片,运行时需要暂停应用
③复制
将内存分为2个区域(区域a和区域b),一个区域空着(区域a),另一个区域(区域b)放对象。垃圾回收时,将区域b还在引用的对象复制到空着的区域(区域a)中去,并且当前区域(区域b)清空。如此反复缺点:复制到a区域的时候,同时进行了内存整理,没有内存碎片。但是需要2倍的内存
④标记+整理
从根节点遍历标记对象,然后遍历整个堆,清除没有标记的对象,并且将有标记的对象压缩到一块的区域内特点:没有内存碎片,也不需要2倍内存
分代回收中将内存分成了3代
①年轻代。
年轻代内分为eden区和两个survivor区。eden区存储刚刚建立的新对象。eden区满后,将还存活的对象复制到一个survivor区中,然后这个survivor区满了以后,将还存活的对象复制到第二个survivor区中去,同时清空第一个survivor区。第二个区满了以后,将第一个survivor区中的存活的对象复制到年老