GC算法之标记清除(Mark-Sweep)和标记压缩/整理(Mark-Compact)和标记-清除-压缩(Mark-Sweep-Compat)

  1. 复制算法:没碎片、费空间  ---->年轻代
  2. 标记清除:①标记要回收的对象②统一回收这些对象     ----->老年代                                                                                              证明要扫描两次,耗时严重    不需要额外空间
  3. 标记整理/标记压缩:就是比标记清除多了一步整理,为了解决这个碎片的问题  ---->老年代 

              ①标记垃圾对象不清除②再次扫描,并在一端滑动存活的对象(没有被标记的对象)③回收垃圾对象 

在整理压缩阶段,不再对标记的对象做回收,而是通过所有存活的对象都向一端移动,然后清除边界以外的内存。可以看到,标记的存活对象将会被整理,按照内存地址一次排列,而被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表少开销多了

没有碎片、需要移动对象的成本

GC算法之标记清除(Mark-Sweep)和标记压缩/整理(Mark-Compact)和标记-清除-压缩(Mark-Sweep-Compat)_第1张图片

GC算法之标记清除(Mark-Sweep)和标记压缩/整理(Mark-Compact)和标记-清除-压缩(Mark-Sweep-Compat)_第2张图片---》GC算法之标记清除(Mark-Sweep)和标记压缩/整理(Mark-Compact)和标记-清除-压缩(Mark-Sweep-Compat)_第3张图片--》GC算法之标记清除(Mark-Sweep)和标记压缩/整理(Mark-Compact)和标记-清除-压缩(Mark-Sweep-Compat)_第4张图片

4.标记-清除-压缩(Mark-Sweep-Compat):多次GC后才压缩(是标记清除和标记压缩的结合。但不算在GC四大算法中)

 

一、哪种方法最好?

没有哪个最好,只有根据每一代垃圾收集的特性用适合它的方法,即------>分代收集算法:

①新生代-->复制

②Old区--->标记清除、标记整理

你可能感兴趣的:(面试,jvm,java,cms)