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