前言
垃圾收集算法是内存回收的方法论;垃圾收集器是内存回收的具体实现。Java虚拟机标准中对垃圾收集器应该如何实现并没有任何规定,因而不同的厂商、不同版本的虚拟机所提供的垃圾收集器都有很大的差异,并且个别都会提供参数供用户依据本人的利用特点和要求组合出各个年代所应用的收集器。
虚拟机里并不是应用一个收集器,而是很多收集器搭配应用,在不同的年代应用不同的收集器。
一、Serial收集器
Serial收集器是最根本、倒退历史最悠久的收集器、已经是虚拟机新生代收集的惟一抉择。这个收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅阐明它只会应用一个CPU或一条收集线程去实现垃圾收集工作,更重要的是在他进行垃圾收集时,必须暂停其余所有的工作线程,直到他收集完结。“Stop-The-World”这项工作理论是是由虚拟机在后盾主动发动和主动实现的,在用户不可见的状况下把用户失常工作的线程全副停掉,这是比拟难以承受的。
二、ParNew收集器
ParNew收集器就是Serial收集器的多线程版本,解决应用多条线程进行垃圾收集之外,其余行为包含Serail收集器可用的所有控制参数(例如:-XX:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop the World、对象调配规定、回收策略等都与Serail收集器完全一致,在实现上,两者也共用了很多代码。
ParNew收集器除了多线程收集之外,其余与Serial收集器相比并没有多大的翻新之处,但它却是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关但很重要的起因是,除了Serial收集器外,目前只有它能与CMS收集器配合工作。
三、Paraller Scanvenge收集器
Paraller Scanvenge收集器是一个新生代收集器,它也是应用复制算法的收集器,又是并行的多线程收集器。
Paraller Scanvenge收集器的特点是它的关注点与其余收集器不同,CMS等收集器的关注点是尽可能的缩短垃圾收集器收集时用户现程的进展工夫,而Paraller Scavenge收集器的指标这是达到一个可管制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的工夫与CPU总耗费工夫的比值。即吞吐量=运行用户代码工夫/(运行用户代码工夫 + 垃圾收集工夫)。
进展工夫越短越适宜须要与用户交互的程序,良好的响应速度能晋升用户体验,而高吞吐量则能够高效率的利用CPU工夫,尽快的实现程序的运算工作,次要适宜在后盾运算而不须要太多交互的工作。
parallel Scavenge收集器提供了两个参数用于准确管制吞吐量,别离是管制最大垃圾收集器进展工夫的-XX:MaxGCPauseMillis参数以及间接设置吞吐量大小的-XX:GCTimeRatio参数。
MaxGCPauseMillis 参数容许的值是一个大于0的毫秒数,收集器将尽可能地保障内存回收破费的工夫不超过设定值。
GCTimeRatio参数的值该当是一个大于0且小于100的整数,也就是垃圾收集工夫占比总工夫的比率。
注:
并行(Paraller):指多条来及收集线程并行工作,但此用户线程依然处于期待状态
并发(Concurrent):值用户线程与垃圾收集线程同时执行(但不肯定是并行的,可能会交替执行),用户程序在持续运行,而垃圾收集程序运行在另一个CPU上。
4、Serial Old收集器
Serial Old 收集器是Serial 收集器的老年代版本,它同样是一个单线程收集器,应用“标记-整顿”算法。这个收集器的次要意义也是在与Client模式下的虚拟机应用。如果在Server模式下,那么他还有两大用处,一是在JDK1.5以及之前的版本中与Paraller Scavenge收集器搭配应用,另一种用处是做为CMS收集器的后备预案,在并发收集产生Concurrent Mode Failure时应用。
五、parallel Old 收集器
Paraller Old收集器是Paraller Scavenge收集器的老年代版本,应用多线程和“标记-整顿”算法。
6、CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收进展工夫为指标的收集器。CMS收集器是基于“标记-革除”算法实现的,它的运作过程分为4个步骤:
1)初始标记(CMS initial mark)
2)并发标记(CMS concurrent mark)
3)从新标记(CMS remark)
4)并发革除(CMS concurrent sweep)
其中,初始标记和从新标记这两个步骤依然须要“Stop the World”(进行工作线程)。初始标记仅仅只是标记一下GC Roots能间接关联到的对象,速度很快。并发标记阶段就是进行GC Roots Tracing的过程,而从新标记阶段则是为了修改并发标记期间因用户程序持续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的进展工夫个别会比初始标记阶段稍长一些,但远比并发标记的工夫短。
七、G1(Garbage-First)收集器
G1(Garbage-First)收集器是一款面向服务端利用的垃圾收集器。如果不计算保护Remembered Set的操作,G1收集器的运作大抵能够分为以下几个步骤:
1)初始标记(Initial Marking)
2)并发标记(Concurrent Marking)
3)最终标记(Final Marking)
4)筛选回收(Live Data Counting and Evacuation)
看完三件事❤️
如果你感觉这篇内容对你还蛮有帮忙,我想邀请你帮我三个小忙:
点赞,转发,有你们的 『点赞和评论』,才是我发明的能源。
关注公众号 『 Java斗帝 』,不定期分享原创常识。
同时能够期待后续文章ing????