深入理解Java虚拟机4(几种垃圾收集器的原理)

本文深入探讨了Java虚拟机(JVM)的多种垃圾收集器,包括Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS和G1。每个收集器的特点、算法和适用场景都有所介绍,特别是CMS和G1收集器,它们在并发性和停顿时间方面进行了优化。CMS收集器关注最短停顿时间,而G1则提供可预测的停顿时间模型,适用于服务端应用。
摘要由CSDN通过智能技术生成

垃圾收集器

  • 垃圾收集算法是内存回收的方法论
  • 垃圾收集器就是内存回收的具体实现
Serial收集器

Serial收集器是最基本、发展历史最悠久的收集器,曾经是虚拟机新生代收集的唯一选择

这个收集器是一个单线程收集器,但它的单线程的意义并不仅仅说明它只会使用一个CPU或一条收集线程区完成垃圾收集工作,更重要的是在于它进行垃圾收集时,必须暂停其它所有工作线程,直到它收集结束

使用复制算法

“Stop The World”这项工作实际上是由虚拟机在后台自动发起和自动完成的。在用户不可见的情况把用户正常工作的线程全部停掉,这对很多引用来说都是难以接受的,如下是Serial/Serial Old收集器的运行过程

在这里插入图片描述

Serial虚拟机依然是虚拟机运行在Client模式下的默认新生代收集器。它也有优于其他收集器的地方:简单而高效(与其它收集器的单线程相比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。在用户的桌面应用场景中,分配给虚拟机管理的内存一般来说不会很大,收集几十兆甚至一两百兆的新生代(仅仅是新生代使用的内存,桌面应用基本上不会再大了),停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,只要不是频繁发生,这点停顿是可以接受的,所以,Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择

ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本,采用的复制算法,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配原则、回收策略都与Serial收集器完全一样,在实现上,这两种收集器也共用了相当多的代码。ParNew收集器工作过程如图:

在这里插入图片描述

ParNew收集器除了多线程收集外,其它与Serial收集器相比并没有太多创新之处,但它确实许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关的很重要的原因是:

  • 除了Serial收集器外,目前只有它能与CMS收集器配合工作。

在JDK1.5时期,HotSpot推出了一款在强交互应用中几乎可认为具有划时代意义的垃圾收集器-----CMS收集器(Concurrent Mark Sweep),这款收集器是HotSpot虚拟机中第一款真正意义上的并发(Concurrent)收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作

不幸的是,CMS作为老年代的收集器,却无法与JDK 1.4.0中已经存在的新生代收集器Parallel Scavenge配合工作,所以在 JDK 1.5中使用CMS来收集老年代的时候,新生代只能选择ParNew或者Serial 收集器中的一个。ParNew收集器也是使用-XX:+UseConcMarkSweepGC选项后的默认新生代收集器,也可以使用-XX:+UseParNewGC选项来强制指定它。

ParNew收集器在单CPU的环境中绝对不会有比 Serial收集器更好

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独一无二的VV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值