收集器可以大致分为:单线程收集器, 并发收集器和并行收集器。

并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

1. Serial 收集器

它是单线程收集器。“单线程”是指它在进行垃圾回收时,会暂停其它所有的线程,直至它收集结束。Serial 收集器对于运行在Client 模式下的虚拟机来说是一个很好的选择。

2. ParNew 收集器

ParNew 收集器是Serial 收集器的多线程版本。它是许多运行在Server模式下的虚拟机中首选的新生代收集器。目前为止,只有它能与CMS收集器配合工作。

它是使用 -XX:+UseConcMarkSweepGC选项后的默认新生代收集器。也可以使用 -XX:+UseParNewGC选项来强制指定它。

3. Parallel Scavenge 收集器

它是一个新生代收集器,又是并行的多线程收集器。它使用复制算法。它的目标是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值。

有两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的 -XX:MaxGCPauseMills 参数以及直接设置吞吐量大小的 -XX:GCTimeRatio参数。MaxGCPauseMills参数的值设置得稍小一点并不能使得系统的垃圾收集速度变得更快,GC停顿时间缩短是以吞吐量和新生代空间来换取的。新生代大小调小了,会导致垃圾收集频率增加。

还有一个参数 -XX:+UseAdaptiveSizePolicy,这是一个开关参数,当打开这个参数后,就不需要手工指定新生代的大小、Eden和Survivor区的比例、晋升老年代对象年龄等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。

4. Serial Old收集器

它是Serial 收集哭的老年代版本。它同样是一个单线程收集器,使用“标记 - 整理”算法。

5. Parallel Old收集器

它是Parallel Scavenge收集器的老年代版本。使用多线程和“标记 - 整理”算法。

在注重吞吐量以及CPU资源敏感的场合,都 可以优先考虑Parallel Scavenge 加 Parallel Old 收集器。

6. CMS 收集器

它是一种以获取最短回收停顿时间为目标的收集器。整个收集过程分为4个步骤:

1)初始标记 -- 仅仅只是标记一下GC Roots能直接关联到的对象。速度很快

2)并发标记 -- 进行GC Roots Tracing的过程

3)重新标记 -- 修正并发标记期间因用户程序继续动作而导致标记产生变动的那一部分对象的标记记录

4)并发清除。

其中 1)和 3)这两个步骤仍然需要“Stop the World”。整个过程耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作。

它默认启动的并发线程数是 ((CPU数量 + 3) /4)。当CPU资源比较紧张时,受到CMS回收器线程的影响,应用系统的性能在垃圾回收阶段可能会非常糟糕。

CMS不是独占式的回收器,在回收过程中,应用程序仍然在不停地工作,又会不断的产生垃圾。这些新生的垃圾在当前CMS回收过程中是无法清除的。因此,CMS回收器是在当堆内存使用率达到某一阈值时便开始进行回收,以确保垃圾回收时,仍有足够的空间供程序使用。这一阈值使用-XX:CMSInitiatingOccupancyFraction 来指定,默认是68。

CMS是基于“标记--清除”算法,会产生大量的内存碎片,-XX:+UseCMSCompactAtFullCollection开关可以使CMS在垃圾收集完成后,进行一次内存碎片整理,内存碎片整理不是并发进行的。-XX:CMSFullGCsBeforeCompaction参数可以用于设定进行多少次CMS回收后,进行一次内存压缩。

7. G1 收集器

G1收集器是一款面向服务端应用的垃圾收集器。在JDK7u4版本开始才有。具备如下特点: 1)并行与并发  2)分代收集  3)空间整合  4)可预测的停顿。

G1收集器将整个Java堆划分为多个大小相等的独立区域。优先清理回收价值大的区域。大致可划分为以下几个步骤: 1)初始标记  2)并发标记  3)最终标记  4)筛选回收。

参数 -XX:MaxGCPauseMillis 用于指定目标最大停顿时间。

参数 -XX:ParallelGCThreads 用于设置并行回收时,GC的工作线程数量。

参数 -XX:InitiatingHeapOccupancyPercent 指定当整个堆使用率达到多少时,触发标记周期的执行。默认值 45。

下图中有连线的收集器说明这两个收集器可以配合使用。

《深入理解Java虚拟机》笔记03 -- 垃圾收集器的更多相关文章

  1. 《深入理解 Java 虚拟机》学习 -- 垃圾收集器

    <深入理解 Java 虚拟机>学习 -- 垃圾收集器 1. Serial 收集器(新生代) 含义: 单线程收集器. 缺点: 进行垃圾收集时,必须暂停其他所有的工作线程. 优点: 简单而高效 ...

  2. 深入理解Java虚拟机(四)——HotSpot垃圾收集器详解

    垃圾收集器 新生代收集器 1.Serial收集器 特点: 单线程工作,收集的时候就会停止其他所有工作线程,用户不可知不可控,会使得用户界面出现停顿. 简单高效,是所有收集器中额外内存消耗最少的. 没有 ...

  3. Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一

    Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...

  4. 垃圾收集器与内存分配策略——深入理解Java虚拟机 笔记二

    在本篇中,作者大量篇幅介绍了当时较为流行的垃圾回收器,但现在Java 14都发布了,垃圾收集器也是有了很大的进步和发展,因此在此就不再对垃圾收集器进行详细的研究.但其基本的算法思想还是值得我们参考学习 ...

  5. 深入理解Java虚拟机笔记——垃圾收集器与内存分配策略

    目录 判断对象是否死亡 引用计数器算法 可达性分析算法 各种引用 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot算法实现 枚举根节点 GC停顿(Sto ...

  6. 深入理解java虚拟机笔记Chapter3-垃圾收集器

    垃圾收集器 垃圾收集(Garbage Collection,GC),它的任务是解决以下 3 件问题: 哪些内存需要回收? 什么时候回收? 如何回收? 本节补充知识: ① s:Survivor区 新生代 ...

  7. 深入理解Java虚拟机笔记

    1. Java虚拟机所管理的内存 2. 对象创建过程 3. GC收集 4. HotSpot算法的实现 5. 垃圾收集器 6. 对象分配内存与回收细节 7. 类文件结构 8. 虚拟机类加载机制 9.类加 ...

  8. 深入理解java虚拟机笔记Chapter12

    (本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...

  9. 深入理解Java虚拟机03--垃圾收集器与内存分配策略

    一.概述  哪些内存需要回收? 什么时候回收? 如何回收? 二.对象已死吗  1.引用计数算法  定义:给对象添加一个引用计数器,当增加一个引用时,加1,当一个引用时,减1; 缺陷:当对象之间互相循环 ...

随机推荐

  1. 【转载】基于注解的SpringMVC简单介绍

    SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet负责转发每一个Request请 ...

  2. Algorithm: dynamic programming

    1. Longest Increasing Subsequence (LIS) problem unsorted array, calculate out the maximum length of ...

  3. GCC的-wl,-rpath=参数

    使用GCC编译动态链接库的项目时,在其他目录下执行很可以出现找不到动态链接库的问题. 这种情况多发生在动态链接库是自己开发的情况下,原因就是程序运行时找不到去何处加载动态链接库. 可能会说在编译时指定 ...

  4. SQL 数据类型 numeric varchar char

    Numeric(10,2) 指字段是数字型,长度为10 小数为两位的 简要描述一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型 字符型 VARCHAR VS CHAR VARCHAR ...

  5. 山东省第四届ACM程序设计竞赛A题:Rescue The Princess(数学+计算几何)

    Rescue The Princess Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 412  Solved: 168[Submit][Status][ ...

  6. promise介绍

    promise简介 Promise的出现,原本是为了解决回调地狱的问题.所有人在讲解Promise时,都会以一个ajax请求为例,此处我们也用一个简单的ajax的例子来带大家看一下Promise是如何 ...

  7. BZOJ 3709 [PA2014]Bohater:贪心【反过来考虑】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3709 题意: 在一款电脑游戏中,你需要打败n只怪物(从1到n编号). 为了打败第i只怪物, ...

  8. 使用gdb调试c/c++代码

    转自 http://blog.csdn.net/haoel/article/details/2879 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较 ...

  9. 微信video和audio无法自动播放解决方案

    //音频,写法一<audio src="music/bg.mp3" autoplay loop controls>你的浏览器还不支持哦</audio> // ...

  10. Apache-SimpleEmail 简单应用

    比JavaMail使用方法要直接,jar包只需要在JavaMail的基础上添加commons-email-1.4.jar即可. 代码: // QQ邮箱发送邮件 SimpleEmail simpleEm ...