深入理解Java虚拟机之垃圾收集器

垃圾收集器

        Java虚拟机规范对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同的版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器.这里讨论的收集器基于JDK1.7 Update 14之后的HotSpot虚拟机(在这个版本中正式提供了商用的G1收集器,之前G1仍处于实验状态),这个虚拟机包含的所有收集器如图:

在这里插入图片描述
        图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用.虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器.

Serial收集器

在这里插入图片描述

简介

        Serial收集器是最基本的、发展历史最悠久的收集器.这个收集器是一个单线程的收集器,它只会使用一个CPU或一条收集线程去完成垃圾收集工作,在进行垃圾收集时,必须停止其他所有的线程,直至它结束,相当于"Stop The World".

缺点

    在垃圾收集时会把用户正常工作的线程全部停掉,经常响应很慢.

优点

    简单高效,由于单CPU运行,没有线程交互的开销,专心回收垃圾,获得最高的单线程收集效率.

ParNew收集器

在这里插入图片描述

简介

        ParNew是Serial收集器的多线程版本,除了多线程收集之外,并没有太多创新之处.Server模式下的虚拟机中首选的新生代收集器,因为除了Serial收集器外,它是唯一能配合CMS收集器进行工作的.

缺点

    在单CPU环境下使用效果还没有Serial收集器效果好

优点

    多线程..,能配合CMS收集器工作.

Parallel Scavenge收集器

在这里插入图片描述

简介

    Parallel Scavenge收集器使用复制算法,是并行的多线程收集器.CMS等收集器关注点是尽可能的缩短垃圾收集时用户线程停顿的时间,而此收集器的目标是达到一个可控制的吞吐量.高吞吐量可以高效率地利用CPU时间,尽快完成程序的运算任务,适合在后台运算,而不需要太多交互的任务.

缺点

    停顿时间长

优点

    吞吐量得到提高

Serial Old收集器

    Serial Old是Serial收集器的老年代版本,主要用于给Client模式下的虚拟机使用.若是在Server模式下,主要有两个用途:一是JDK1.5之前版本配合Parallel Scavenge收集器使用.另一个是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用.

Parallel Old收集器

简介

         Parallel Old是Parallel Scavenge收集器的老年代版本,是JDK1.6才提供的,在此之前,新生代的Parallel Scavenge收集器一直处于尴尬的状态,因为除了能配合Serial Old收集器外别无选择.由于Serial Old在服务端应用性能上的"拖累",所以未必能在整体上获得吞吐量最大化效果.
        注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge+Parallel Old收集器.

CMS收集器

在这里插入图片描述

简介

        CMS(Concurrent Mark Sweep) 是一种以获取最短回收停顿时间为目标的收集器,CMS基于"标记-清除"算法实现的.

运行过程

初始标记
    标记一下GC Roots能直接关联到的对象,速度很快.
并发标记
    进行GC Roots追踪的过程
重新标记
    为了修正并发标记期间因用户程序继续运行而导致标记变动的那部分对象的标记记录.
并发清除
    并发方式清除垃圾

    其中,初始标记,重新标记仍然需要"Stop The World".

缺点

  • 对CPU资源非常敏感
  • 无法处理浮动垃圾(标记过程中不断产生的垃圾,只能到下一次GC才能清除)
  • 清除后会出现大量空间碎片,不易存储大对象(需要大量连续内存空间的对象,比如byte数组)

优点

"Stop The World"时间短
并发处理

G1收集器

在这里插入图片描述

简介

G1是一款面向服务端应用的垃圾收集器,能够并行与并发,分代收集,空间整合,可预测的停顿.
G1收集器将整个Java堆划分为多个均同大小的独立区域(Region),虽然保留了新生代和老年代,但它们都是一部分独立区域的集合.
G1根据每个区域垃圾堆积价值的大小,在后台维护一个优先列表,优先回收最大的区域.

运行过程

初始标记

        只是标记下GC Roots能直接关联的对象,并且修改TAMS(NEXT Top at Mark Start)的值,让下一阶段用户程序并发运行时,能在正确的区域中创建新对象.这过程需要停顿线程.但耗时短.

并发标记
    从GC Roots开始对堆中对象进行可达性分析,找到存活的对象.
最终标记
    为了修正并发标记期间因用户程序继续运行而导致标记变动的那一部分标记记录
筛选回收
    首先对各个区域的回收价值和成本进行排序,根据用户所期待的GC停顿时间来指定回收计划.  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值