前言
垃圾收集算法是内存回收的方法论;垃圾收集器是内存回收的具体实现。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????