读《深入理解Java虚拟机》笔记(四)垃圾收集器

 2019-12-22 10:55  阅读(897)
文章分类:JVM

**Serial收集器:**最基本,发展历史最悠久的收集器。一个单线程的收集器只会使用一个cpu或者一条线程去完成垃圾收集工作更重要的是在进行垃圾收集时,必须暂停所有的工作线程,直到它收集结束。依然是虚拟机运行在Client模式下的默认新生代器。

2019120001399\_1.png

**ParNew收集器:**除了多线程收集之外,和Serial收集器没有多大区别,是许多运行在Server模式下的虚拟机中首选的新生代收集器,只有它和Serial能与cms收集器配合工作。

并行(paraeel):指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。

并发(conCurrent)指用户线程与垃圾收集线程同时执行(不一定并行也可能交替执行),用户线程在继续运行,而垃圾收集程序运行于另一个cpu上。

2019120001399\_2.png

Parallel Scavenge收集器:目标是达到一个可控制的吞吐量(Throughput),也就是cpu用于运行用户代码的时间与cpu总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。Parallel Scavenge收集器提供了两个参数用于控制吞吐量。分别是控制最大垃圾收集停顿时间MaxGCPauseMillis和直接设置吞吐量大小。GCTimeRatios的参数。MaxGCPauseMillis参数的值是一个大于0的毫秒数,收集器尽可能保证内存回收的时间不超过整个值。不过Gc停顿时间的缩短是以牺牲吞吐量和新生代的空间来换取的。GCTimeRatios参数的值是一个大于0且小于100的整数,也就是垃圾收集时间占总时间的比率,相当于是吞吐量的倒数。开关参数:UseAdaptiveSizePolicy(自适应调节策略),虚拟机会根据当前系统的运行情况动态指定Eden,Survicor比例等细节参数。这也是和ParNew收集器的重要区别。

2019120001399\_3.png

**Serial old收集器:**是Serial收集器的老年代版本,同样是一个单线程收集器。使用标记整理算法。在Server模式下主要有两个用途,在jdk1.5及之前的版本中与Parallel Scavengue收集器搭配使用,另一种用途是作为cms收集器的后备预案,在并发收集发生

Concurrent mode Failure时使用。

**Parallel old 收集器:**是parallel scavenge收集器的老年代版本,使用多线程和标记-整理算法。在注重吞吐量以及cpu资源敏感的场合,都可以有限考虑parallel scavengu加上parallel old 收集器。

**Cms(concurrent Mark Sweep)**收集器是一种以获取最短回收停顿时间为目标的收集器。基于标记-清除算法实现,大致分为四个步骤,初始标记—-并发标记—–重新标记—并发清除。其中,初始标记,重新标记这两个步骤仍然需要“stop the world”.初始标记只是标记一下那些对象能直接关联到GC roots速度很快。并发标记就是进行Gc roots tracing 的过程,重新标记则是为了修正并发标记期间因用户程序继续运作而导致的标记产生变动的那一部分对象的标记记录。一般比初始标记的时间长比并发标记的阶段短。

由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都是可以和用户线程一起工作,所以,总体上来看,cms收集器的内存回收过程是与用户线程一起并发执行的。

主要不足:一 对cpu资源非常敏感。Cms默认启动的线程数是(cpu数量+3)/4,可能导致用户程序执行速度降低。后来提供了一种增量式并发收集器(i-cms)但是效果一般,不再倡导使用。二 无法处理浮动垃圾,由于垃圾收集阶段用户线程还在执行,自然还会有新的垃圾产生,这一部分垃圾出现在标记过程之后,cms无法在当次收集,只好等待下一次GC时再清理掉。可能出现“concurrent mode failure”失败导致另一次FULL GC产生。三 标记清除算法大量空间碎片产生。可以使用cmsFullGCsBeforeCompaction设置。

2019120001399\_4.png

G1收集器;主要特征,并发与并行:使用多个cpu来缩短stop-the-world停顿的时间,通过并发的方式让javaa程序继续执行。分代收集:可以不需要其它收集器就能管理整个GC堆,能采用不同的方式去处理新创建的对象和已经熬过多次GC的旧对象。空间整合:G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。可预测的停顿:让使用者指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,有计划的使用Remembered set避免在整个堆中进行全区域的垃圾收集。

2019120001399\_5.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 读《深入理解Java虚拟机》笔记(四)垃圾收集器

相关推荐