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

并行(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. 使用 eslint 和 editorconfig 规范代码

    项目中使用eslint 为什么使用eslint : 为了保持代码风格的统一 在做vue项目的时候, 基本上都会使用 vue-cli 脚手架去创建一个vue 项目,里面可以选择使用eslint 代码检测 ...

  2. 【转】Java中的代码点与代码单元

    转载自:http://blog.csdn.net/xujinsmile/article/details/8526387 最近看core java,之前一直不明白,看了不少帖子和博客,总算搞明白了. J ...

  3. 《CSS权威指南(第三版)》---第三章 结构和层叠

    这章主要讲的是当某个对象被选择器多次提取使用样式之后的一些冲突性解决方案: 1.特殊性:指的是当多个效果作用的时候的最终选择: 这个规则用0,0,0,0来比较.其中:内联式是1,0,0,0  ID选择 ...

  4. <关于JSP技术>运行机制及语法概述(附对本次同济校内ACM选拔赛决赛的吐槽)

    (一)JSP运行的机制 JSP是一种建立在Servlet规范功能之上的动态网页技术,它们都是在通常的网页文件中嵌入脚本代码,用于产生动态内容,不过和ASP不同的是JSP文件中嵌入的是Java代码和JS ...

  5. poj 1469 COURSES (二分图模板应用 【*模板】 )

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18454   Accepted: 7275 Descript ...

  6. spawning cl.exe

    可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的“Compiling... ,Error spawning cl.exe”错误提示给郁闷过.很多人的选择是重装,实际 ...

  7. 关于MVC模板渲染的一点小事type="text/template"

    先上一个demo,简单粗暴,请自便 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  8. 我所理解的RESTful Web API [设计篇]【转】

    原文:http://www.cnblogs.com/artech/p/restful-web-api-02.html <我所理解的RESTful Web API [Web标准篇]>Web服 ...

  9. 15 个最佳的 jQuery 布局插件【转】

    英文原文:15 Best jQuery Grid Plugins for Developers 现如今,网站开发设计的需求会要求自动适应所有移动设备,即响应式网站: 在开发网站时必须考虑对平板设备融合 ...

  10. centos7搭建redis主从复制,并模拟故障切换。

    Cntos7搭建redis主从复制,并模拟故障主从切换 主从复制搭建 主机:192.168.161.179 从机:192.168.161.180 1.        安装主redis 自己本地环境,关 ...