标记:找到不能被作为垃圾回收的对象并标记。标记的对象保留,未被标记的对象作为垃圾释放。
标记:将一定不能被回收的根对象作为GC Root对象,从根对象出发,沿着它的引用链找当前对象有没有被根对象引用到。若是则不能被回收,加标记。若否,则不加标记,GC时释放掉。
清除:有标记则保留,没有标记则释放。
释放后的内存不连续,造成内存碎片问题。需要连续内存时碎片内存不够用。
标记清除的基础上多了整理阶段。
整理:移动未被清除的对象朝一端靠拢,避免了内存碎片的问题。
多了整理步骤,要重新计算内存的引用地址,内存复制等,效率会变低。
把内存分成两部分,一部分用来存对象,一部分作为空闲区域。将标记的需要存活的对象复制到空闲区域,复制完成后将原来那部分所有内容清空。此时空区域再作为空闲区域,复制后的区域作为存对象区域。整个过程不会有内存对象产生。且效率比标记整理高。
占用了一份额外的内存。