码迷,mamicode.com
首页 > 其他好文 > 详细

收集器

时间:2020-04-19 17:34:10      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:并行   找不到   初始   节点   系统   响应时间   https   collect   避免   

 

不同的垃圾收集器代表不同的回收算法  
Serial收集器是针对新生代的收集器,采用的是Copying算法 Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法,标记-压缩算法
Parallel 并行收集器 Copying算法
Parallel Old收集器 并行收集器 Mark-Compact算法
CMS收集器是基于“”标记--清除”(Mark-Sweep)算法实现的

回收算法

可达性分析算法 http://www.imooc.com/article/36845      gc优化 https://blog.csdn.net/myle69/article/details/80957776
算法思路:通过一系列称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何的引用链,(也就是从GC Roots到这个对象不可达),那么证明此对象是不可用的。

标记-清除算法
标记:首先标记所有需要回收的对象,在标记完成之后统计回收所有被标记的对象,它的标记过程即为上面的可达性分析算法。
清除:清除所有被标记的对象

复制算法

标记-压缩算法(标记-清除改进)
在老年代的对象大都是存活对象,复制算法在对象存活率教高的时候,效率就会变得比较低。根据老年代的特点,有人提出了“标记-压缩算法(Mark-Compact)”
标记过程与标记-清除的标记一样,但后续不是对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。
这种方法既避免了碎片的产生,又不需要两块相同的内存空间,因此,其性价比比较高。

分代收集算法(对收集器进行细化配置,比如同时设置 Parallel 和 Parallel Old)
根据对象存活的周期不同将内存划分为几块,一般是把Java堆分为老年代和新生代,这样根据各个年代的特点采用适当的收集算法。
新生代每次收集都有大量对象死去,只有少量存活,那就选用复制算法,复制的对象数较少就可完成收集。
老年代对象存活率高,使用标记-压缩算法,以提高垃圾回收效率。

 

串行、并行收集器

次要收集年轻代 主要收集年老代

1,串行收集器
是最简单的收集器,对于单处理器系统真是绝佳上选。当然,它也是所有收集器里面最不常用的。串行收集器使用一个单独的线程进行收集,不管是次要收集还是主要收集

2,并行收集器(吞吐量优先)
使用最高效算法、多个并行线程进行收集
并行收集器有两种形式:一种并行收集器(-XX:+ UseParallelGC)在次要回收中使用多线程来执行,在主要回收中使用单线程执行;另一种是从Java 7u4开始默认使用的并行旧生代收集器(Parallel Old collector )(XX:+UseParallelOldGC),在次要回收和主要回收均使用多线程。在tenured space分配的对象使用简单的凹凸指针(bump-the-pointer)算法即可。当年老区填满后会触发主要回收。

3,并发收集器(响应时间优先)
CMS(并发标记清理收集器,Concurrent Mark Sweep)
CMS(-XX:+ UseConcMarkSweepGC)收集器在年老代中使用,专门收集那些在主要回收中不可能到达的年老对象。它与应用程序并发运行,在年老代中保持一直有足够的空间以保证不会发生年轻代晋升失败。

晋升失败将会触发一次FullGC,CMS会按照下面几个步骤处理:
初始化标记:寻找GC根。
并发标记:标记所有从GC根开始可到达的对象。
并发预清理:检查被更新过的对象引用和在并发标记阶段晋升的对象。
重标记:捕捉预清洁阶段开始更新的对象引用。
并发清理:通过回收被死对象占用的内存更新可用空间列表。
并发重置:重置数据结构为下一次运行做准备。

当年老对象变得不可访问时,占用空间会被CMS回收并且放入到空闲空间列表中。当晋升发生的时候,会查询空闲空间列表,为晋升对象找到大小合适的位置。这增加了晋升的成本,因而相比并行收集器也增加了次要收集的成本。
注意:CMS 不像压缩收集器,随着时间的推移会在年老代中产生碎片。对象晋升可能失败,因为一个大对象可能在年老代在找不到一块足够容身的可用空间。如果发生了这样的事,日志会记录一条“晋升失败”的消息,然后并且触发一次FullGC来压缩存活的年老对象。对于这种压缩驱动的FullGC,由于CMS使用单线程压缩,可以想见会比使用并行旧生代收集器的主要回收使用更长的暂停时间。
https://blog.csdn.net/u012388497/article/details/17953741

收集器

标签:并行   找不到   初始   节点   系统   响应时间   https   collect   避免   

原文地址:https://www.cnblogs.com/xingminghui111/p/12732376.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!