一、CMS收集器java
CMS收集器是一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现,它的运做过程以下:面试
1)初始标记算法
2)并发标记并发
3)从新标记性能
4)并发清除spa
初始标记、重新标记这两个步骤仍然须要“stop the world”,初始标记仅仅只是标记一下GC Roots能直接关联到的对象,熟读很快,并发标记阶段就是进行GC Roots Tracing,而从新标记阶段则是为了修正并发标记期间因用户程序继续运做而致使标记产生表动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长点,但远比并发标记的时间短。线程
CMS是一款优秀的收集器,主要优势:并发收集、低停顿。对象
缺点:排序
1)CMS收集器对CPU资源很是敏感。在并发阶段,它虽然不会致使用户线程停顿,可是会由于占用了一部分线程而致使应用程序变慢,总吞吐量会下降。内存
2)CMS收集器没法处理浮动垃圾,可能会出现“Concurrent Mode Failure(并发模式故障)”失败而致使Full GC产生。
浮动垃圾:因为CMS并发清理阶段用户线程还在运行着,伴随着程序运行天然就会有新的垃圾不断产生,这部分垃圾出现的标记过程以后,CMS没法在当次收集中处理掉它们,只好留待下一次GC中再清理。这些垃圾就是“浮动垃圾”。
3)CMS是一款“标记--清除”算法实现的收集器,容易出现大量空间碎片。当空间碎片过多,将会给大对象分配带来很大的麻烦,每每会出现老年代还有很大空间剩余,可是没法找到足够大的连续空间来分配当前对象,不得不提早触发一次Full GC。
G1是一款面向服务端应用的垃圾收集器。G1具有以下特色:
一、并行于并发:G1能充分利用CPU、多核环境下的硬件优点,使用多个CPU(CPU或者CPU核心)来缩短stop-The-World停顿时间。部分其余收集器本来须要停顿Java线程执行的GC动做,G1收集器仍然能够经过并发的方式让java程序继续执行。
二、分代收集:虽然G1能够不须要其余收集器配合就能独立管理整个GC堆,可是仍是保留了分代的概念。它可以采用不一样的方式去处理新建立的对象和已经存活了一段时间,熬过屡次GC的旧对象以获取更好的收集效果。
三、空间整合:与CMS的“标记--清理”算法不一样,G1从总体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。
四、可预测的停顿:这是G1相对于CMS的另外一个大优点,下降停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能创建可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片断内,
五、G1运做步骤:
一、初始标记;二、并发标记;三、最终标记;四、筛选回收
上面几个步骤的运做过程和CMS有不少类似之处。初始标记阶段仅仅只是标记一下GC Roots能直接关联到的对象,而且修改TAMS的值,让下一个阶段用户程序并发运行时,能在正确可用的Region中建立新对象,这一阶段须要停顿线程,可是耗时很短,并发标记阶段是从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段时耗时较长,但可与用户程序并发执行。而最终标记阶段则是为了修正在并发标记期间因用户程序继续运做而致使标记产生变更的那一部分标记记录,虚拟机将这段时间对象变化记录在线程Remenbered Set Logs里面,最终标记阶段须要把Remembered Set Logs的数据合并到Remembered Set Logs里面,最终标记阶段须要把Remembered Set Logs的数据合并到Remembered Set中,这一阶段须要停顿线程,可是可并行执行。最后在筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所指望的GC停顿时间来制定回收计划。
尾部介绍几个名词:
1,并行(Parallel):多个垃圾收集线程并行工做,此时用户线程处于等待状态
2,并发(Concurrent):用户线程和垃圾收集线程同时执行
3,吞吐量:运行用户代码时间/(运行用户代码时间+垃圾回收时间)
面试题:
吞吐量优先和响应优先的垃圾收集器如何选择?
(1) 吞吐量优先的并行收集器
参数配置:
1, -Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:ParallelGCThreads=8
说明:选择Parallel Scavenge收集器,而后配置多少个线程进行回收,最好与处理器数目相等。
2,-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:+UseParallelOldGC
说明:配置老年代使用Parallel Old
3,-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:MaxGCPauseMills=100
说明:设置每次年轻代垃圾回收的最长时间。如何不能知足,那么就会调全年轻代大小,知足这个设置
4,-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseParallelGC -XX:MaxGCPauseMills=100 -XX:+UseAdaptiveSizePolicy
说明:并行收集器会自动选择年轻代区大小和Survivor区的比例。
(2)响应时间优先的并发收集器
1, -Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
说明:设置老年代的收集器是CMS,年轻代是ParNew
2,-Xmx4g -Xms4g -Xmn2g -Xss200k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
说明:首先设置运行多少次GC后对内存空间进行压缩,整理。同时打开对年老代的压缩(会影响性能)
spark面试顺便问道,Spark Streaming应该选择何种垃圾收集器?
--driver-java-options和 spark.executor.extraJavaOptions这两个参数将driver和Executor垃圾回收器设置为cms,以提升响应速度。