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. 多级反馈序列c语言模拟实现

    多级反馈队列调度算法: 1.设置多个就绪队列,并给队列赋予不同的优先级数,第一个最高,依次递减. 2.赋予各个队列中进程执行时间片的大小,优先级越高的队列,时间片越小. 3.当一个新进程进入内存后,首 ...

  2. 20155333 2016-2017-2 《Java程序设计》第4周学习总结

    20155333 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承基本上就是避免多个类间重复定义的共同行为,在Java中,子类只能继承一个父类. priv ...

  3. Hbase单机安装及使用hbase shell进行简单操作

    一,配置环境变量 在etc/prifile中加入java环境变量及hbase环境变量: #set java environment JAVA_HOME=/usr/local/lhc/jdk1.8.0_ ...

  4. LVS入门篇(二)之LVS基础

    1. LVS介绍 LVS是Linux虚拟服务器(LinuxVirtualServers),使用负载均衡技术将多台服务器组成一个虚拟服务器.它为适应快速增长的网络访问需求提供了一个负载能力易于扩展,而价 ...

  5. C#反射的简单示例

    反射(Reflection)可以在运行时获 得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等反正说白了就 ...

  6. device_create与device_register

    //device_create的定义如下 struct device *device_create(struct class *class, struct device *parent, dev_t ...

  7. Zigbee系列(网络)

    Zigbee设备类型 Coordinator:形成网络,选择信道.PANID.允许其他设备加入等. Router: 作为路由节点,转发报文. End Device: 终端节点,不转发报文. Zigbe ...

  8. 在腾讯云上安装mysql遇到的问题

    卸载mysql: 1.sudo apt-get autoremove --purge mysql-server-5.5 5.5 是数据库版本, mysql -v 显示版本信息 2.sudo apt-g ...

  9. Linux系统服务(daemon)(鸟哥Linux私房菜笔记)

    Linux系统服务(daemon) 一.SystemV的init管理机制(脚本式启动)1.服务启动分类stand alone 独立启动模式super daemon 总管程序 2.服务的启动.关闭与观察 ...

  10. MySQL-MMM方案

    参考文档: 官方文档:http://mysql-mmm.org/mmm2:guide 本文对mmm方案做简单介绍,并做1个简单的验证. 一.MySQL-MMM方案 1. MMM方案简介 MMM(Mul ...