GC算法之标记清除(Mark-Sweep)和标记压缩/整理(Mark-Compact)和标记-清除-压缩(Mark-Sweep-Compat)
- 复制算法:没碎片、费空间 ---->年轻代
- 标记清除:①标记要回收的对象②统一回收这些对象 ----->老年代 证明要扫描两次,耗时严重 不需要额外空间
- 标记整理/标记压缩:就是比标记清除多了一步整理,为了解决这个碎片的问题 ---->老年代
①标记垃圾对象不清除②再次扫描,并在一端滑动存活的对象(没有被标记的对象)③回收垃圾对象
在整理压缩阶段,不再对标记的对象做回收,而是通过所有存活的对象都向一端移动,然后清除边界以外的内存。可以看到,标记的存活对象将会被整理,按照内存地址一次排列,而被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表少开销多了
没有碎片、需要移动对象的成本
---》
--》
4.标记-清除-压缩(Mark-Sweep-Compat):多次GC后才压缩(是标记清除和标记压缩的结合。但不算在GC四大算法中)
一、哪种方法最好?
没有哪个最好,只有根据每一代垃圾收集的特性用适合它的方法,即------>分代收集算法:
①新生代-->复制
②Old区--->标记清除、标记整理