垃圾收集器
< 返回列表时间: 2020-05-31来源:OSCHINA
1.Parallel scavenge+old:年轻代采用复制算法,老年代采用标记-整理算法,是多线程的并行收集器。
它注重的是可控制的吞吐量,适合于后台运算而不需要与用户有太多的交互的时候。 吞吐量:是CPU用于运行用户线程的时间和总CPU消耗时间的比值。
2.ParNew:其它和Parallel差不多,其区别主要在于ParNew更关注 停顿时间 ,且 可以与CMS收集器组队 工作。是许多工作在Server端的首要选择。
3.CMS:采用标记-清除算法,为了 获取最短停顿时间 为目标的多线程并发的收集器。
有 初次标记(STW)-并发标记-重新标记(STW)-并发清除 四个过程:
初次标记:需要stop the world。仅仅是标记一下GC root能直接可达的对象。
并发标记:进行GC root tracing过程,标记所有可达的对象,但由于此时收集器线程和用户线程并发运行,可能会不断更新引用域,所以会对引用更新的地方做跟踪记录让重新标记阶段去处理。
重新标记:需要stop the world 。修正因用户线程运行而导致的标记变动的那一部分的标记记录。
并发清除:重新启动用户线程,同时对标记的区域做清除。
ps:上面只是参考大部分面试答案,具体的还是不太清除,比如看了一篇分析:重新标记是标记存活对象,并发清除只是将对象标为不可达,真正清除是用啥?,整个过程标记的对象是老年代对象和新生代引用的老年代对象?并发标记之后还要预清理和可控制的预清理啥的.... CMS垃圾收集器详解
缺点: 对CPU资源敏感:会占用一部分线程用于垃圾收集而使应用程序变慢,总吞吐量下降。 无法处理浮动垃圾:浮动垃圾是在标记过程之后产生的垃圾。由于用户线程运行不可避免会产生浮动垃圾,而CMS只能等到下一次收集才能去处理。 产生内存碎片:由于采用的标记-清除算法,必然会产生大量内存碎片,可能会出现老年代内存空间足够但没有连续内存无法存放而导致的full GC。
4.G1收集器:是一款面向服务器的处理器,主要针对配备了多核CPU以及大容量内存的机器。
它有以下特点 : 并行与并发:由于使用了多个CPU可以有效减少停顿时间,部分其他收集器需要定下用户线程再执行的GC操作,G1可以通过并发的方式去运行用户线程,提高吞吐量了。 空间整合:从整体上看G1采用的是标记整理算法,而局部上使用的是复制算法。这意味着G1运行期间不会产生内存碎片,收集完成后仍有规整的可用内存,避免了分配大对象时没有连续内存空间来存放而提前触发下一次GC。 可预测的停顿时间:G1相比CMS的一大优势就是他可以建立可预测的时间模型,它能够使使用者明确在M毫秒的时间片段内,G1收集的时间不超过N毫秒。 分代整合:尽管G1不需要其它收集器来分代收集,仍保留了分代的概念,会采用不同的方式收集新创建的对象和存活了一段时间的对象。 而使G1有以上特点的原因是:
1.G1相较于其他收集器有不同的内存布局:它将Java堆划分成多个相同大小的独立区域(region),尽管还是有新生代和老年代的概念,但两者之间不再是物理隔离的了,而是一部分可以不连续的region集合。
2.避免全堆扫描:G1为每个region维护了一个与之对应的记忆集(Remember Set)来记录新生代和老年代之间的引用关系从而避免了全堆扫描。
3.有优先级的区域。G1会跟踪记录每个region中的垃圾价值大小,在后台建立一个优先列表,根据允许的收集时间,优先回收价值最大的region。
这种使用了region划分内存空间以及有优先级的区域回收方式保证了G1能够在有限时间内获得尽可能高的收集效率 。
收集过程:
初次标记--并发标记--最终标记--筛选回收。
5.Serial +Serial old:新生代采用复制算法、老年代采用标记整理算法,是需要stw的,单线程的收集器,适合于单CPU下的Client模式。
参考: 深入理解JVM(3)——7种垃圾收集器 (深入解析)
一篇文章彻底搞定所有GC面试问题 (面试回答思路) 面试官问我G1回收器怎么知道你是什么时候的垃圾?
热门排行