标记-复制算法、标记-清理算法、标记-整理算法,这三种算法都是在分代收集的机制上成立的
其原理是将内存分红两部分,一部份内存1放对象,一部份内存2为空,当放对象的内存1进行垃圾回收时,会将仍然存活的对象标记起来,而后复制到另外一块内存2中,再把内存1清空。而后进行第二次回收也是如此。这种方式常常在年轻代的垃圾回收中使用,即每次将被标记的仍然存活的对象放到另外一块的survivor区中。此算法的缺点是:有一部份内存必须为空,才能存放那些仍然存活的对象,若是在老年代中使用,很浪费内存。算法
其原理是将内存中仍然存活的对象标记起来,而后清理掉没有被标记的对象(少数状况下会标记那些须要清理的对象,而后去清除掉)。此算法的优势是较上一种节省空间,缺点是,收集后的内存对象排列不整齐,会出现大量的不连续的垃圾碎片,二是,标记的对象过多,会很浪费时间。多线程
标记-整理算法即标记到那些仍然存活的对象,将这些对象都朝着一个区域移动,最后全部的对象都是在一块链接的区域内,最后清理掉这个区域外的全部对象。清理后的内存都是连续的,而且不须要从新分配一块空白内存。jvm
serial(串行)垃圾收集器,是单线程收集器,在执行垃圾收集时,会STW(stop the world),中止一切其余的线程,是最先的垃圾收集器,用户体验不是很好,可是减小了与其余线程的来回切换,因此很简单高效(与其余收集器的单线程相比)。
serial old收集器是serial的老年代版收集器,其做用是在jdk1.5及以前与Parallel Scavenge收集器搭配使用,另外一种用途是做为CMS收集器的后备方案,当cms收集器出现“concurrent mode failure"时,会STW,并切换为该收集器进行处理。线程
serial收集器是在新生代中使用,使用的是标记复制算法
serial old收集器在老年代使用,适用的是标记整理算法
parallel Scavenge收集器是serial收集器的多线程版本,默认使用和cpu核数相同的线程数去进行垃圾回收,在jvm参数中加入
-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)分别使用相应的收集器。对象
新生代采用标记复制算法,老年代使用标记整理算法
Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。JDK8默认的新生代和老年代收集器是:Parallel Scavenge收集器和Parallel Old收集器()。内存
与parallel收集器类似,不一样点是与cms搭配使用的收集器。原理
新生代采用标记复制算法,老年代使用标记整理算法
未完待续。。。~~~~用户体验