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. PostgreSQL的pg_stats学习

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL统计信息索引页     回到顶级页面:PostgreSQL索引页 对于pg_stas,说明文档在这里: http://w ...

  2. 【RAC搭建报错】在RAC搭建到grid安装前的检查时,报错

    这种ip的报错,无非是检查防火墙,ip配置的原因 而我防火墙已关闭,ip也没配错 最后的原因是因为我172.16.1.41/42这两个IP选的虚拟机没有配置网段 [grid@rac01 grid]$ ...

  3. Tp框架之命名空间

    命名空间,相当于虚拟目录 实现自动加载类的机制 初始命名空间:Library文件夹 初始命名空间下面有很多根命名空间: 1.Library里面的文件夹 2.APP的模块文件夹 在tp框架中,只有这两个 ...

  4. Android开发笔记——视频录制播放常见问题

    本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...

  5. 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

    使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...

  6. 阿里巴巴将在美国推出电子商务网站11 Main

    新浪科技讯 北京时间2月11日晚间消息,阿里巴巴集团周二向路透社证实,阿里巴巴将通过旗下子公司Vendio和Auctiva在美国推出一个电子商务网站. 该网站的名称为“11 Main”(11main. ...

  7. python2/3 发送https请求时,告警关闭方法

    问题: 使用Python3 requests发送HTTPS请求,已经关闭认证(verify=False)情况下,控制台会输出以下错误: InsecureRequestWarning: Unverifi ...

  8. 【java】中缀表达式转后缀表达式 java实现

    算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...

  9. OpenFlow协议

    功能 1.0版本Openflow:控制器通过Openflow协议与交换机建立了安全通道(Sceure Channel),下发流表. 1.3版本Openflow:多控制器,多流表. 用于实现Contro ...

  10. 软件工程 - 第二十次作业 Alpha 事后诸葛亮(团队)

    Alpha 事后诸葛亮(团队) 组长本次作业链接:https://www.cnblogs.com/dawnduck/p/10056026.html 现代软件工程 项目Postmortem 设想和目标 ...