JVM的经典垃圾收集器

一.经典垃圾收集器
各款经典收集器之间的关系如下
图中展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用 ,图中收集器所处的区域,则表示它是属于新生代收集器抑或是老年代收集器
二.收集器
这个收集器是一个单线程工作的收集器,但它的单线程的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束 。图3-7示意了/ Old收集器的运行过程 。
三.收集器
收集器实质上是收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的行为包括收集器可用的所有控制参数(例如:-XX:、
-hold、-XX:re等)、收集算法、Stop The World、对象分配规则、回收策略等都与收集器完全一致,在实现上这两种收集器也共用了相当多的代码 。收集器的工作过程如图3-8所示 。
四. 收集器
收集器也是一款新生代收集器,它同样是基于记-复制算法实现的收集器,也是能够并行收集的多线程收集器…… 的诸多特性从表面上看和非常相似,那它有什么特别之处呢?
收集器的特点是它的关注点与其他收集器不同
所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值,即:
如果虚拟机完成某个任务,用户代码加上垃圾收集总共耗费了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99% 。
收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:参数以及直接设置吞吐量大小的-XX:参数 。
由于与吞吐量关系密切, 收集器也经常被称作“吞吐量优先收集器” 。除上述两个参数之外, 收集器还有一个参数-XX+y值得我们关注 。这是一个开关参数,当这个参数被激活之后,就不需要人工指定新生代的大小(-Xmn)、Eden与区的比例(-XX:)、晋升老年代对象大小(-XX:ld)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量 。这种调节方式称为垃圾收集的自适应的调节策略(GC )
五. Old收集器
Old是收集器的老年代版本,它同样是一个单线程收集器,使用标记-整理算法 。这个收集器的主要意义也是供客户端模式下的虚拟机使用 。如果在服务端模式下,它也可能有两种用途:一种是在JDK 5以及之前的版本中与 收集器搭配使用 ,另外一种就是作为CMS收集器发生失败时的后备预案,在并发收集发生 Mode 时使用 。这两点都将在后面的内容中继续讲解 。Old收集器的工作过程如图3-9所示 。

JVM的经典垃圾收集器

文章插图
六. Old收集器
Old是 收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现 。这个收集器是直到JDK 6时才开始提供的,在此之前,新生代的 收集器一直处于相当尴尬的状态,原因是如果新生代选择了 收集器,老年代除了 Old()收集器以外别无选择,其他表现良好的老年代收集器,如CMS无法与它配合工作 。由于老年代 Old收集器在服务端应用性能上的“拖累”,使用 收集器也未必能在整体上获得吞吐量最大化的效果 。同样,由于单线程的老年代收集中无法充分利用服务器多处理器的并行处理能力,在老年代内存空间很大而且硬件规格比较高级的运行环境中,这种组合的总吞吐量甚至不一定比加CMS的组合来得优秀 。
直到 Old收集器出现后,“吞吐量优先”收集器终于有了比较名副其实的搭配组合,在注重吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑 加 Old收集器这个组合 。Old收集器的工作过程如图3-10所示 。