1.Serial收集器

优点,是简单而高效,单线程避免了线程交互的开销.

缺点,进行垃圾回收时需要Stop the world(暂停所有用户线程).

2.ParNew收集器

它是Serial收集器的多线程版本,新生代才有多线程并行收集.是CMS收集器(下文会介绍)的默认新生代收集器.

ParNew在单CPU的情况下,会比Serial收集器效率更差,因为多线程交互的开销.

但是,如今的计算机普遍是多CPU多核,而ParNew默认的线程数量是CPU的数量.因此它更加适应潮流.

3.Parallel Scavenge收集器

它是一个追求吞吐量的收集器.

吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

可以通过-XX:GCTimeRatio参数来设置希望达到的吞吐量.

Parallel Scavenge收集器会根据实际运行情况,自适应调整新生代Eden:Survivor的比例,意在达到目标吞吐量.

4.Serial Old收集器

它是Serial收集器的老年代版本,使用标记整理算法.主要意义在于给Client模式下的虚拟机使用.

Server模式下,在JDK1.5和以前的版本配合Parallel Scavenge收集器搭配使用.

另外,Serial Old收集器也是CMS收集器的预备方法,当出现Concurrent Mode Failure时使用.

5.Parallel Old收集器

它是Parallel Scavenge收集器的老年代收集器,使用多线程标记整理算法.

6.CMS(Concurrent Mark Sweep)

它追求的是低停顿时间,适合注重服务响应速度的场景,比如互联网网站B/S系统的Server端上.

CMS是基于标记清除算法的,分成4个步骤:

1.初始标记(CMS Initial Mark)

需要暂停用户线程,标记Root能直接关联到的对象,速度很快耗时很短.

2.并发标记(CMS Concurrent Mark)

无需暂停用户线程,进行Root Tracing的过程

3.重新标记(CMS Remark)

需要暂停用户线程,为了修正并发标记期间因为用户线程继续运行而产生标记变动的那一部分对象的标记记录.

这个阶段的停顿时间一般会比初始标记阶段稍长,但远比并发标记时间短.

4.并发清除(CMS Concurrent Sweep)

CMS收集器的缺点是:

1)吞度量降低了;

2)无法清除浮动垃圾(因垃圾回收阶段,用户线程执行产生的垃圾);

3)标记清除算法会产生内存碎片.

7.G1收集器

G1收集器是最先进最前沿的垃圾收集器,特点:

1.并行与并发,和CMS收集器类似;

2.分代收集.G1能独立管理整个Java堆的垃圾收集;

3.空间整合,不产生内存碎片.从整体看,G1是基于标记整理算法,从局部(两个Region之间)上来看是基于复制算法;

4.可预测的停顿.

G1收集器把整个Java堆划分成多个大小相等的独立区域(Region).G1跟踪每个Region的垃圾堆积的价值大小(回收所获得空间和回收耗时的经验值).

在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(Garbage-First的名称由来).

G1收集器执行步骤:

1.初始标记(Initial Marking)

2.并发标记(Concurrent Marking)

3.最终标记(Final Marking)

4.筛选回收(Live Data Counting and Evacuation)

前面3个步骤都和CMS收集器类似.最后一步的筛选回收中,G1收集器首先对各个Region的回收价值和成本进行排序,根据用户期望停顿时间来制定回收计划.

从Sun公司透露出来的信息来看,筛选回收阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控.

而且停顿用户线程将大幅提高收集效率,所以采用暂停用户程序并行执行筛选回收的方案.

Java虚拟机的内存管理----垃圾收集器的更多相关文章

  1. 深入java虚拟机学习 -- 内存管理机制

    前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...

  2. 深入理解Java虚拟机 第三章 垃圾收集器 笔记

    1.1   垃圾收集器 垃圾收集器是内存回收的具体实现.以下讨论的收集器是基于JDK1.7Update14之后的HotSpot虚拟机.这个虚拟机包含的所有收集器有: 上图展示了7种作用于不同分代的收集 ...

  3. 深入理解java虚拟机(五)垃圾收集器

    垃圾收集器 垃圾收集器是垃圾收集算法的具体实现.Java规范对垃圾收集器的实现没有做任何规定,因此不同的虚拟机提供的垃圾收集器可能有很大差异.HotSpot虚拟机1.7版本使用了多种收集器.如下图. ...

  4. Java虚拟机的内存管理

    众所周知,Java程序员写的代码是没有办法控制Java对象的内存释放的,完全有JVM暗箱操作. 虽然程序员把内存的释放的任务都交给了Java虚拟机,但是并不代表Java程序就不存在内存泄漏. 反而,某 ...

  5. <<深入Java虚拟机>>-第三章-垃圾收集器与内存分配策略-学习笔记

    垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算 ...

  6. 深入了解Java虚拟机(2)垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 由于JVM中对象的频繁操作是在堆中,所以主要回收的是堆内存,方法区中的回收也有,但是比较谨慎 一.对象死亡判断方法 1.引用计数法 就是如果对象被引用一次,就给计数器+1,否 ...

  7. 深入理解java虚拟机(2)------垃圾收集器和内存分配策略

    GC可谓是java相较于C++语言,最大的不同点之一. 1.GC回收什么? 上一篇讲了内存的分布. 其中程序计数器栈,虚拟机栈,本地方法栈 3个区域随着线程而生,随着线程而死.这些栈的内存,可以理解为 ...

  8. 《深入理解Java虚拟机》读书笔记-垃圾收集器与内存分配策略

    在堆里存放着java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前需要知道哪些对象还存活,哪些对象已经死去.那怎么样去判断对象是否存活呢? 一.判断对象是否存活算法 1.引用计数法 实现思路:给 ...

  9. java虚拟机(二)--垃圾收集器与内存分配策略

    1.判断对象是否存活的算法: 1.1.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用他时,计数器+1,当引用失效时,计数器-1,任何时刻计数器为0的对象就是不可能再被引用的,但是他很难解决 ...

随机推荐

  1. 20155334 2016-2017-2 《Java程序设计》第四周学习总结

    20155334 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 第六章:继承与多态 继承:面对对象中,子类继承父类,避免重复的行为定义 extends表示会 ...

  2. 2017-2018-1 20155338《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155338<信息安全技术>实验二--Windows口令破解 一.试验环境 系统环境:Windows 实验工具: LC5 SuperDic 二.实验内容及要求 ...

  3. 【转载】GC基本算法及C++GC机制

    原文: GC基本算法及C++GC机制 阅读目录 前言 基本概念 有向可达图与根集 三种基本的垃圾收集算法及其改进算法 1.引用计数算法 2. Mark & Sweep 算法 3. 节点复制算法 ...

  4. SaltStack入门篇(四)之深入理解SaltStack远程执行

    1.目标 2.执行模块 3.返回 salt ‘*’ cmd.run ‘uptime’ 命令 目标 执行模块 执行模块参数 1.SlatStack远程执行–目标 执行目标:https://docs.sa ...

  5. Maven学习(十七)-----Maven外部依赖

    Maven外部依赖 正如大家所了解的那样,Maven确实使用 Maven 库的概念作依赖管理.但是,如果依赖是在远程存储库和中央存储库不提供那会怎么样? Maven 提供为使用外部依赖的概念,就是应用 ...

  6. 使用Git提交与管理代码

    要成为一个合格的码农,必须要有效对自己的代码进行管理,最近打算有空就整理一下自己以前写得代码,把不涉及实验室的机密的内容等放到github上,之前只知道git clone 别人的代码,希望有一天自己的 ...

  7. ubuntu18.04安装mongoDB 4.0

    STEP 1:  在终端输入GPK码 $  sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334B ...

  8. sqoop安装与简单实用

    一,sqoop安装 1.解压源码包 2.配置环境变量 3.在bin目录下的 /bin/configsqoop 注释掉check报错信息 4.配置conf目录下 /conf/sqoop-env.sh 配 ...

  9. 技本功丨请带上纸笔刷着看:解读MySQL执行计划的type列和extra列

    本萌最近被一则新闻深受鼓舞,西工大硬核“女学神”白雨桐,获6所世界顶级大学博士录取 货真价值的才貌双全,别人家的孩子 高考失利与心仪的专业失之交臂,选择了软件工程这门自己完全不懂的专业.即便全部归零, ...

  10. sql注入waf绕过简单入门

    0x1  白盒 0x2 黑盒 一.架构层 1.寻找源站==> 2.利用同网段==> 3.利用边界漏洞==> ssrf只是一个例子 二.资源限制 Waf为了保证业务运行,会忽略对大的数 ...