摘自《深入理解Java虚拟机》

一、什么是:

  GC算法是 方法论,那么垃圾收集器就是具体的 实现。

二、四种 垃圾回收算法

  1、标记-清除算法:最基础的收集算法;不足有两点:1标记和清除两个过程效率都不高;2会产生空间碎片;

  2、复制算法:实现简单,效率较高;不足是空间利用率底,只得意了一半的空间。

         HotSpot中新生代主要也是 复制算法,但不是按1:1来划分空间,而是划分为Eden和两个Survivor空间,默认是8:1,也就是新生代能利用 90%空间;当Survivor空间不足时,需要依赖老年代分配担保。

  3、标记-整理算法:主要用在老年代中;和标记-清除不同的是,它先标记,再移动,再清除边界外的空间;

  4、分代收集算法:现在商业虚拟机主要的收集算法,是把堆分为新生代和老年代,然后分别采用上面3种算法;主要是新生代用复制算法,老年代用标记-清除 或 标记-整理算法;

三、7 种收集器:

  JDK 1.7 update 14 HotSpot虚拟机垃圾收集器;

  

  tenured generation(老年代);

  连线的收集器表示可搭配使用,共7种作用于不同分代的收集器。

  下面主要从三个方面总结,特性、原理、应用;

  1. Serial

    a. 最基本、历史最悠久;简单高效;

    b. 单线程收集器;在它进行垃圾收集时,必须暂停其它所有的工作线程(STOP THE WORLD),直到它收集结束;采用复制算法回收;

    d. Client模式默认的 新生代 收集器,是Client不错的选择。

  2. Serial Old

    a. 同Serial收集器;

     b. 使用 标记-整理 算法;

    c. 主要用在Client模式的 老年代,和Serial搭配使用;

      也可用在Server模式下:1是在JDK 1.6前与Parallel Scavenge搭配;2使用CMS的后备方案,在CMS 并发收集发生 Concurrent Mode Failure时使用;

    

  3. ParNew

    a. 简单高效;其实就是Serial收集器的多线程版本,两者共用了相当多的代码;

    b. 并行多线程;采用复制算法;

    c. 在Server模式下首选的收集器;除了Serial外,目前只有它能与CMS搭配使用(主要也是和CMS搭配);

  4. Parallel Scavenge

    a. 和ParNew类似;使GC尽的吞吐量可控,使之高效率使用CPU,尽快完成运算任务;可打开“自适应调节”策略,使之自动配置虚拟机各项参数。

      关注点和其它收集器不太一样,CMS等收集器关注的是缩短用户线程的停顿时间,但多花费时间多于Parallel Scavenge;

      吞吐量 =  运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间);如虚拟机部花费100分钟,其中垃圾收集花费1分钟,那吞吐量即99%;

    b. 并行多线程;采用复制算法;

    c. 主要用在 后台运算 任务 不需要太多交互 上。

  5. Parallel Old

    a. 由于老年代的Serial Old在服务端应用性能上的“拖累”,它主要为了和 Parallel Scavenge 搭配;JDK 1.6才开始有;

    b. 采用 标记-整理;

    c. 主要用在服务模式下,和 Parallel Scavenge 搭配;

    

  6. CMS(Concurrent Mark Sweep)

    a. 强交互,具有划时代意义;真正意义上的并发收集器;

    b. 主要四个步骤:

       1. 初始化标记 initial mark (STW)

       2. 并发标记 concurrent mark

       3. 重新标记 remark (STW)

       4. 并发清除 concurrent sweep

      其中 初始化 和 重新标记 都会STW,重新标记停顿时间长于初始化标记,但两者的总共停顿时间都很短。大部分时间都花在并发标记和并发清除上。

     使用 标记-清除 算法,会产生空间碎片;当老年代空间不够分配时,在触发一次FullGC前会进行碎片的合并和整理。

     CMS主要是在并发环境下进行,所以它不能像其它收集器那样等到老年代用完了再GC,它需要预留一部分空间给并发收集线程使用,它可以设定一个阈值。如果预留的空间也不够收集线程使用,就会出现一次 ConcurrentModeFailure,这时会启用后备方案Serial Old方案来清理,这样也会带来STW,停顿时间就会变长。

    c. 通常和 ParNew搭配运行在服务端,也是现在用服务端主流的收集器。

    

  7. G1(Garbage-First)

      a. JDK 1.7正式使用,最新的的技术实现;高并发,主要面向服务端;不需要和其它收集器搭配;

      b. 主要四个步骤:

       1. 初始化标记 initial mark (STW)

       2. 并发标记 concurrent mark

       3. 最终标记 remark (STW)

       4. 筛选回收 concurrent sweep(可并,可停顿,停顿不会太长且效率更高)

       整体上是 标记-整理 算法,但局部两个Region之间是复制算法,

       其它收集器都是针对整个新生代 或 整个老年代的收集,而G1可对Region进行分隔收集,通过计算每个Region可回收的空间大小,维护一个优先列表,回收时优先回收空间较大的(这也是Garbage-Firsst的由来),这样也可实现用户定义的时间内完成收集。

      c. 现在在实践生产中还应用得不多,只是它已是一种技术驱向;

    

三、其它点:

  1、垃圾回收中的 并行(Parallel)与 并发(Concurrent):

    并行:多个回收线程在多个CPU上一起执行回收操作;会STOP THE WORLD;

    并发:回收线程和其它任务线程并发执行(不一定就是并行,可能会交替执行)工作;不会STOP THE WORLD,用户感觉不到停顿;

扩展阅读:

  深入理解Major GC, Full GC, CMS

  JVM client模式和Server模式的区别

JVM垃圾回收算法 及 垃圾收集器的更多相关文章

  1. 3-JVM垃圾回收算法和垃圾收集器

    垃圾回收算法和垃圾收集器 1.什么是垃圾回收 对于内存当中无用的对象进行回收,如何去判断一个对象是不是无用的对象. 引用计数法: 每个对象中都会存储一个引用计数,每增加一个引用就+1,消失一个引用就- ...

  2. Java虚拟机四:垃圾回收算法与垃圾收集器

    在Java运行时的几个数据区域中,程序计数器,虚拟机栈,本地方法栈3个区域随着线程而生,随线程而灭,因此这几个区域的内存分配和回收具有确定性,不需要过多考虑垃圾回收问题,因为方法结束或者线程结束时,内 ...

  3. java垃圾回收算法和垃圾收集器

    垃圾收集算法.垃圾回收算法.java垃圾收集器 目录1. 垃圾收集算法1)引用计数法2)根搜索法2. 垃圾回收算法1)复制算法2)标记-清除算法3)标记-整理算法4)分代收集算法3. java垃圾收集 ...

  4. 6.GC垃圾回收算法和垃圾收集器的关系

    JAVAGC垃圾回收机制和常见垃圾回收算法 推荐博客:JVM垃圾回收机制和常见垃圾回收算法 JVM的内存结构.垃圾回收算法

  5. 《深入理解java虚拟机》笔记(5)垃圾回收算法及垃圾收集器

    一.标记-清除算法 算法:分为标记和清除两个阶段,首先标记出所有需要回收的对象,再对标记对象进行回收. 不足之处:效率不高,会产生大量不连续内存碎片,导致下次分配较大内存时,若内存不足不得不触发垃圾回 ...

  6. JVM(十),垃圾回收之新生代垃圾收集器

    十.垃圾回收之新生代垃圾收集器 1.JVM的运行模式 2.Serial收集器(复制算法-单线程-Client模式) 2.ParNew收集器(复制算法-多线程-Client模式) 3.Parallel ...

  7. JVM垃圾回收算法(最全)

    JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:j ...

  8. JVM垃圾回收算法及回收器详解

    引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...

  9. JVM 垃圾回收算法和垃圾回收器

    JVM 垃圾回收算法和垃圾回收器. 一.垃圾回收的区域 栈:栈中的生命周期是跟随线程,所以一般不需要关注. 堆:堆中的对象是垃圾回收的重点. 方法区:这一块也会发生垃圾回收,不过这块的效率比较低,一般 ...

随机推荐

  1. BZOJ 3749: [POI2015]Łasuchy【动态规划】

    Description 圆桌上摆放着n份食物,围成一圈,第i份食物所含热量为c[i]. 相邻两份食物之间坐着一个人,共有n个人.每个人有两种选择,吃自己左边或者右边的食物.如果两个人选择了同一份食物, ...

  2. 算法复习——求最长不下降序列长度(dp算法)

    题目: 题目背景 161114-练习-DAY1-AHSDFZ T2 题目描述 有 N 辆列车,标记为 1,2,3,…,N.它们按照一定的次序进站,站台共有 K 个轨道,轨道遵从先进先出的原则.列车进入 ...

  3. 【图论】bnuoj 52810 Splitting the Empire

    acm.bnu.edu.cn/v3/contest_show.php?cid=9208#problem/G [题意] 给定一个无向图,要求把这个无向图的点划分到不同的集合里,使得每个集合的点之间两两没 ...

  4. 【2018.10.20】noip模拟赛Day3 二阶和

    今年BJ省选某题的弱化版…… 这看起来就没那么难了,有几种方法维护,这里提两种. 第一种(傻逼的我写的) 维护 一维&二维前缀和. 对于一个长度为$m$的序列$b_1,b_2,...,b_m$ ...

  5. cf21D Traveling Graph

    You are given undirected weighted graph. Find the length of the shortest cycle which starts from the ...

  6. Min(BZOJ 1441)

    题目描述 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 输入 第一行给出数字N,代表有N个数 下面一行给出N个数 输出 S ...

  7. MongoDB_语法命令

    可以通过MongoDB shell 来连接MongoDB服务: ./mongo   进入交互 数据库-->集合-->文档 几个文档就组成了集合,可以设置固定大小的集合,集合就会有过期机制, ...

  8. 标准C程序设计七---15

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  9. MongoDB数据类型查询与修改

    MongoDB数据类型和对应的代码如下: MongoDB可以根据字段类型进行文档查询: 可以看到,friend集合的文档中,age字段有32位int类型的,也有double类型的.如果需要把doubl ...

  10. Java使用IText(VM模版)导出PDF,IText导出word(二)

    ===============action=========================== //退款导出word    public void exportWordTk() throws IOE ...