4.几种常见的垃圾收集器

1.垃圾收集算法

标记-复制算法、标记-清理算法、标记-整理算法,这三种算法都是在分代收集的机制上成立的

标记-复制算法:

其原理是将内存分成两部分,一部分内存1放对象,一部分内存2为空,当放对象的内存1进行垃圾回收时,会将仍然存活的对象标记起来,然后复制到另一块内存2中,再把内存1清空。然后进行第二次回收也是如此。这种方式经常在年轻代的垃圾回收中使用,即每次将被标记的仍然存活的对象放到另一块的survivor区中。此算法的缺点是:有一部分内存必须为空,才能存放那些仍然存活的对象,如果在老年代中使用,很浪费内存。

标记-清理算法

其原理是将内存中仍然存活的对象标记起来,然后清理掉没有被标记的对象(少数情况下会标记那些需要清理的对象,然后去清除掉)。此算法的优点是较上一种节省空间,缺点是,收集后的内存对象排列不整齐,会出现大量的不连续的垃圾碎片,二是,标记的对象过多,会很浪费时间

标记-整理算法

标记-整理算法即标记到那些仍然存活的对象,将这些对象都朝着一个区域移动,最后所有的对象都是在一块连接的区域内,最后清理掉这个区域外的所有对象。清理后的内存都是连续的,并且不需要重新分配一块空白内存。

2.几种常见的垃圾收集器

serial垃圾收集器

serial(串行)垃圾收集器,是单线程收集器,在执行垃圾收集时,会STW(stop the world),停止一切其他的线程,是最早的垃圾收集器,用户体验不是很好,但是减少了与其他线程的来回切换,所以很简单高效(与其他收集器的单线程相比)。

serial old收集器是serial的老年代版收集器,其作用是在jdk1.5及之前与Parallel Scavenge收集器搭配使用,另一种用途是作为CMS收集器的后备方案,当cms收集器出现“concurrent mode failure"时,会STW,并切换为该收集器进行处理。

serial收集器是在新生代中使用,使用的是标记复制算法

Parallel Scavenge收集器

parallel Scavenge收集器是serial收集器的多线程版本,默认使用和cpu核数相同的线程数去进行垃圾回收,在jvm参数中加入

-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)分别使用相应的收集器。

新生代采用标记复制算法,老年代使用标记整理算法

Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。JDK8默认的新生代和老年代收集器是:Parallel Scavenge收集器和Parallel Old收集器()。

parNew 收集器

与parallel收集器相似,不同点是与cms搭配使用的收集器。

新生代采用标记复制算法,老年代使用标记整理算法

cms收集器与三色标记算法

G1收集器

zgc收集器

未完待续。。。~~~~

原文 

https://segmentfault.com/a/1190000023326658

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 4.几种常见的垃圾收集器

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址