理解JVM(七):垃圾回收器

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

并发(Concurrent)

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

吞吐量

CPU用于运行用户代码时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

HotSpot虚拟机的垃圾回收

Serial

Stop The World

ParNew

  • Serial收集器的多线程版本,和Serial的唯一区别就是使用了多条线程去垃圾收集。
  • 除了Serial,只有它可以和CMS搭配使用的收集器。
  • 用作新生代收集器,复制算法。

Parallel Scavenge

  • 用作新生代收集器,复制算法。
  • 关注高吞吐量,可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
  • Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的 -XX:MaxGCPauseMillis
    参数以及直接设置吞吐量大小的 -XX:GCTimeRatio
    参数。

Serial Old

  • Serial收集器的老年代版本,单线程,标记-整理 算法。
  • 一般用于Client模式的虚拟机。
  • 当虚拟机是Server模式时,有2个用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用 ,另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。

Parallel Old

  • Parallel Scavenge收集器的老年代版本,使用多线程和 标记-整理 算法。在JDK 1.6中开始提供。
  • 在注重吞吐量的场合,配合Parallel Scavenge收集器使用。

CMS(Concurrent Mark Sweep)

  • 一种以获取最短回收停顿时间为目标的收集器。适合需要与用户交互的程序,良好的响应速度能提升用户体验。
  • 基于 标记—清除 算法。适合作为老年代收集器。
  • 收集过程分4步:
    Stop The World
    Stop The World
    
  • 耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以时并发执行的。
  • 缺点:
    • 并发阶段,虽然不会导致用户线程暂停,但会占用一部分线程(CPU资源),导致应用变慢,吞吐量降低。默认启动收集线程数是(CPU数量+3)/4。即当CPU在4个以上时,并发回收时垃圾收集线程不少于25%的CPU资源,并且随着CPU数量的增加而下降。但是当CPU不足4个(譬如2个)时,CMS对用户程序的影响就可能变得很大。
    • 无法清除浮动垃圾。并发清除阶段,用户线程还在运行,还会产生新垃圾。这些垃圾不会在此次GC中被标记,只能等到下次GC被回收。
    • 标记-清除 算法会产生大量不连续内存,导致分配大对象时内存不够,提前触发Full GC

原文 

https://juejin.im/post/5b35ec86e51d4558d217ee1e

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 理解JVM(七):垃圾回收器

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址