这篇文章主要讲解了“Java中有几种垃圾收集器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中有几种垃圾收集器”吧!
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、虚拟主机、营销软件、网站建设、裕民网站维护、网站推广。
垃圾收集器就是垃圾收集算法的具体实现。它们分别是新生代的:Serial、ParNew、ParallelScavenge老年代的:SerialOld、ParallelOld、CMS以及适用于新生代和老年代的G1。算上jdk11的ZGC目前一共是八种垃圾收集器。
Serial收集器
Serial是最早的垃圾收集器,这是一个单线程收集器,它只适用一个CPU或者是一条收集线去执行回收任务。
ParNew收集器
ParNew是一个新生代的多线程的收集器,它相当于是Serial的多线程版本。它的一些参数配置和Serial基本完全相同。只不过ParNew收集器在工作的时候,是多个线程工作的
ParNew适合在多个CPU场景下使用,而我们的线上服务器基本都是多核CPU,所以,使用新生代的ParNew搭配老年代的CMS收集器还是挺常见的,我所在的部门的系统线上就是使用的ParNew+CMS组合。与Serial相同的是,ParNew在进行垃圾回收的时候,也会暂停所用的用户线程。
ParallelScavenge收集器
ParallelScavenge也是一个新生代收集器,并且也是一个多线程收集器,ParallelScavenge关注的点是应用的吞吐量,吞吐量=用户代码运行时间/用户运行代码时间+GC时间,它提供了两个参数用来控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数和直接设置吞吐量大小的-XX:GCTimeRatio参数。GCTimeRatio参数的值是一个大于0且小于100的整数,也就是垃圾收集时间占总时间的比率,相当于是吞吐量的倒数。高吞吐量可以高效的利用CPU时间,尽快完成计算任务,因此,ParallelScavenge收集器也用于需要密集计算不需要进行用户交互的一些后台。
SerivalOld收集器
SerivalOld收集器是垃圾收集的老年代版本,也是一个单线程收集器。
ParallelOld收集器
ParallelOld收集器是ParallelScavenge的老年代版本。可以使用ParallelScavenge+ParallelOld组合,在注重吞吐量和CPU资源敏感的场合可以优先考虑ParallellSCavenge和ParallellOld组合。
CMS(ConcurrentMarkSweep)收集器
CMS(ConcurrentMarkSweep),并发标记清除,这是一种追求低停顿时间为的收集器。互联网时代,用户体验为王,垃圾收集的时间越短,给用户带来的体验就越好。CMS收集器整个回收过程可以分为四个步骤:
初始标记(CMSinintmark)
并发标记(CMSconcurrentmark)
重新标记(CMSremarkmark)
并发清除(CMSconcurrentsweep)
G1(GarBage-First)收集器
G1收集器是一款面向服务端的收集器,也就是说,它将低停顿时间作为终极目标。G1与其他垃圾收集器的区别是它可以控制垃圾收集时间在某一个范围之内。与CMS垃圾收集的运行过程类似,它分为初始标记,并发标记,最终标记,筛选回收。G1之所以能够将停顿时间控制在一个指定的时间内,就是因为它可以选择性的进行回收。
G1尝试着去满足最小的停顿时间,在G1中,停顿时间是可以设置的,是可控制的,之所以可以建立可预测的停顿时间模型,是因为G1避免了在java堆中进行全区域的垃圾收集。传统的新生代老年代的内存模型被多个大小相等的独立区域(Region)所取代。如下图所示,虽然新生代和老年代的概念还保留着,但是他们不再是物理隔离的了,他们都是由Region所组成。G1在清除阶段是有选择性的,它会根据设置的停顿时间,选择回报率最大的Region。Region可以说是G1回收器一次回收的最小单元。即每一次回收都是回收N个Region。这个N是多少,主要受到G1回收的效率和用户设置的软实时目标有关。
ZGC
Z垃圾收集器(ZGC)是可伸缩的低延迟垃圾收集器。ZGC可以同时执行所有昂贵的工作,而不会将应用程序线程的执行停止超过10ms,这使得它适合于要求低延迟和/或使用非常大的堆(数TB)的应用程序。
目前ZGC没有分代,每次GC都会标记整个堆,将堆分为2M(small),32M(medium),n*2M(large)三种大小的页面(Page)来管理,根据对象的大小来判断在哪种页面分配,大部分对象标记和对象转移都是可以和应用线程并发。
感谢各位的阅读,以上就是“Java中有几种垃圾收集器”的内容了,经过本文的学习后,相信大家对Java中有几种垃圾收集器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
文章名称:Java中有几种垃圾收集器
网页链接:http://lswzjz.com/article/pdpcsp.html