垃圾回收器

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。垃圾回收器,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

对于Java程序员来说,不用去考虑太多对象的完整生命周期,因为有了垃圾收集器,可以让我们更加关注程序的逻辑实现,当然,并不代表有了垃圾收集器我们就不必关心对象如何回收,在面对一些复杂的问题时,垃圾回收仍然需要拿到桌面上来考虑

Java提供的垃圾收集器有很多,我们现在主要了解的,就主要有以下七种:

GC1

了解了他们的种类过后,我们肯定需要知道,关于垃圾收集器,他们之间的区别应该从哪里

评判,这里就需要了解他们之间的评价标准

主要有两个评价参数:

  1. 吞吐量: 用户时间和总时间的比值
  2. 暂停时间:垃圾回收线程停止工作的时间

了解了这些之后,我们就可以来探索各个GC回收器之间各自的特性和由来啦!!!

Serial回收器:串行回收

\ 新生代 老年代
名字 Serial GC Serial Old GC
收集算法 复制算法 标记-压缩算法
优点 垃圾回收线程是单线程的,会Stop The World
缺点 简单而高效(与其他收集器的单线程比)
	使用-XX:+UseSerialGC开启SerialGC

注意事项:

  • 一般都是单核的CPU才会使用Serial回收器

ParNew(管新生代)

和Serial很像,是它的多线程版本,new是指新生代,使用的是复制算法,老年代和Serial Old垃圾收集器一起使用,使用的是标记-压缩算法,也会Stop The World,由于是并行,所以会减少等待时间,(不上不下,已经失宠)

  1. 和Serial收集器的对比

    单个CPU条件下,ParNew收集器不比Serial收集器更高,但是他是并行的,多核要更快

  2. 是否可以和CMS结合使用

    除了Serial之外,目前只有ParNew能和CMS配合使用

    可以使用-XX:+UseParNewGC指定ParNew收集器执行内存回收任务(新生代)
    
    -XX:ParallelGCThreads限制线程数量,默认开启和CPU相同的线程数
    

Parallel Scavenge回收器(吞吐量优先)

和ParNew不同,Parallel收集器的目标就是达到一个可控制的吞吐量,它也被称为吞吐量优先的垃圾回收器

\ 新生代 老年代
收集算法 复制算法 标记-整理算法
  1. 和ParNew对比

    自适应调节策略是它和ParNew的不同之处

  2. 优点

    高吞吐量则可以高效率的利用CPU时间,尽快完成程序的运算任务,只要适合在后台运算而不需要太多交互的任务,因此,常见的在服务器环境中使用,比如执行批量订单处理,订单支付,工资支付,科学计算的应用程序

Parallel Scavenge回收器在Jdk1.6使用Parallel Old收集器用来替代老年代的Serial Old收集器

  参数设置:
  -XX:UseParallelGC :  新生代使用Parallel ScanvageGC
  -XX:+UseParallelOldGC : 使用Parallel Old垃圾回收器
  -XX:ParallelGCThreads : 设置年轻代并行收集线程的参数,最好和CPU核数设置成一样!!!
  -XX:MaxGCPauseMills :设置垃圾回收器最大停顿时间(GC时间占总时间的比例,和吞吐量相反)
  -XX:GCTimeRatio : 垃圾回收时间占总时间比例

CMS(current-Mark-Sweep)

这款收集器是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作,CMS收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间,良好的响应速度更能提升用户体验

G1出现之前,CMS使用还是比较广泛的。

原理:
在这里插入图片描述四个阶段:

  1. 初始标记
    仅仅是标记出GC Roots能直接关联到的对象
  2. 并发标记:
    从GC Roots直接关联对象开始遍历整个对象图
  3. 重新标记:
    修正并发标记期间,因用户程序继续运行而导致标记发生变动的那一部分对象的标记记录,这里需要Stop The World
  4. 并发清理:
    清理已经死亡的对象,释放内存空间,由于不需要移动存活对象,所以这个阶段是可以和用户线程并发执行的

CMS的特点理解:

  1. 完全STW是不可能的,只是尽可能的缩短暂停时间
  2. 由于最耗时时间的并发标记和并发清除都不需要暂停工作,所以整体的回收时地停顿的时间很短,在CMS回收过程中,还应该确保应用程序有足够的内存可用,当堆内存使用率达到某一阈值时,便开始进行回收,当内存碎片过多后,后产生Concurrent Mode Failure异常,然后临时启动Serial收集器来进行老年代回收

CMS的优点和缺点:

  • 优点:并发收集,低延迟
  • 缺点:
    1. 会产生内存碎片
    2. CMS收集器对CPU资源非常敏感:在并发阶段,它虽然不会导致用户停顿,但是会因为占用了一部分线程而导致应用程序变慢,总吞吐量会降低
    3. CMS收集器无法处理浮动垃圾(并发标记阶段产生的垃圾),在并发标记阶段由于程序的工作线程和垃圾收集线程是挺尸运行或交叉运行的,那么在并发标记阶段如果产生新的垃圾对象,CMS将无法对这些垃圾对象进行标记,最终会导致这些新产生的垃圾对象没有被及时回收,从而只能在下一次执行GC时释放这些之前未被回收的垃圾空间

注意点:要保证用户线程能继续执行(前提是它的用户线程能够),所以就得预留相对而言比较多的内存

设置的参数:
   -XX:+UseConcMarkSweepGC
   -XX:+UseCMSCompactAtFullCollection 用于指定在执行完Full GC之后对内存进行整理
   -XX:CMSFullGCsBeforeCompaction 设置在执行多少次Full GC后对内存空间进行压缩整理
   -XX:ParallelCMSThreads 设置CMS的线程数量,默认是(ParallelThreads+3)/4

JDK14已经移除了CMS垃圾回收器

一道面试题:
如果有人问,Serial GC,Parallel GC,CMS这三个GC有什么不同呢?
1. 如果你想要最小化的使用内存和并行开销,请使用Serial GC
2. 如果你想要最大化应用程序的吞吐量,请选Parallel GC
3. 如果你想要最小化GC的中断或停顿时间,请选CMS GC

G1垃圾回收器

已经有了前面几个垃圾回收器,为什么还要造出G1回收器呢?

  1. 应用程序所对应的业务越来越庞大,复杂,用户越来越多,经常造成STW的GC又跟不上实际需求
  2. 适应不断扩大的内存和不断增加的处理器数量

目标:在延迟可控的情况下获得尽可能高的吞吐量,所以才担当起“全功能收集器”的重任和

期望

  1. G1的参数设置:
-XX:+UseG1GC		开启G1收集器,jdk9以后默认开启

GC2

  1. G1的特点
    与其他GC收集器相比,G1使用了全新的分区算法

并行和并发

  1. 并行性:可让多个GC线程同时工作,有效利用多核计算能力
  2. 并发性:G1拥有和用户线程交互运行的能力

分代收集

  • 它会区分年轻代和老年代,但它不要求整个Eden,Servivor,老年代都是连续的(网格状老年代)
  • 它是将将堆空间分为若干个区域,这些区域包含了逻辑上的年轻代和老年代

空间整合

  • 内存划分为一个一个Region,Region之间是复制算法,整体上是标记压缩,两个算法都可以避免内存碎片

可预测的停顿时间模型

G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不能超过N毫秒

  • G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的的空间大小和回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先收集价值最大的Region,保证了G1收集器在有限的时间内可以获取尽可能高的收集效率

G1回收器的缺点

  • 相比于CMS,G1还不具备压倒性的优势,比如在用户程序运行过程中,G1无论是为了垃圾收集产生的内存占用还是垃圾收集运行时的额外负载都比CMS要高

总结来说就是:

   G1在大内存机器上优于CMS,但CMS在小内存机器上有优势,一般临界点在6-8G内存之间

其他

G1的设置就是简化JVM性能调优,开发人员只需要简单的三步来进行调优:
设置步骤

1.开启G1垃圾收集器
2.设置堆的最大内存
3.设置最大的停顿时间

另外:G1提供了Young GC,Mixed GC,Full GC三种GC方式,没有Old GC

注意点:

  • 在hotspot中,除了G1之外的其他垃圾收集器都是使用JVM内置的线程进行GC,而G1可以使用应用线程(操作系统里面的线程)承担GC的工作

分区Region : 划整为0(使用指针碰撞)

所有的Region大小相同,且在JVM生命周期内不会被改变

GC4

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202546.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!