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

并行(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. 关于wx.redirectTo、wx.navigateTo失效问题

    问题:在app.json页面中若配置了tabBar,并且要跳转的目标页面也在tabBar中时,那么常用的几种页面跳转方式便失效了.即不能跳转到tabBar中定义的页面. 解决办法:若要跳转至tabBa ...

  2. flex做页面。用来做视频的后台服务器是fms

    作为新一代的富客户端互联网技术的佼佼者,Flex这种技术已经被越来越多的公司所采用,被越来越多的用户和程序员所接受.以下列出Flex十大优势: 1.Flex与Flash:可以让普通程序员开发制作Fla ...

  3. High Performance Browser Networking

    Chapter 1. Primer on Latency and Bandwidth As a result, to improve performance of our applications, ...

  4. 后端CORS解决跨域问题

    一 . 为什么会有跨域问题 是因为浏览器的同源策略是对ajax请求进行阻拦了,但是不是所有的请求都给做跨域,像是一般的href 属性,a标签什么的都不拦截. 二 . 解决跨域的方法 解决跨域有两种方法 ...

  5. Apache NiFi 开发 处理器使用说明

    NIFI的使用: 注意:FlowFile由[属性]和[内容]组成,在解析的过程中这个概念非常重要,因为有些组件操作的是属性,有些组件操作的是内容,在配置组件时Destination配置项的选择很重要, ...

  6. HTTP的referer机制

    Quesion: 在项目中遇到了访问某些网络上的图片但是打开是forbidden的情况,原来这是一些网站为了避免图片被盗取所以采取的保护机制,如果不是从原网站上访问的图片,就禁止访问.那么这种情况应该 ...

  7. 灰色大气企业html5模板

    灰色大气企业html网页模板是一款以灰色为背景的大气简洁企业html5网站模板. 下载地址:http://www.huiyi8.com/sc/10860.html

  8. Mysql中文检索匹配与正则

    今天在用sql模糊查询包含字母d的时候,发现一些不包含此字母的也被查询出来了: SELECT * FROM custom WHERE custom_realname LIKE '%d%' 查询了一下, ...

  9. PHP按照比例随机

    有这样的需求,在打开链接的时候,随机(按照项目的某个属性的比例随机)跳转到指定的几个项目的某一个项目页面 比如项目A:80  项目B:20 那么跳转到项目A 的比例为80%,项目B的比例为20% 那么 ...

  10. What can I yield?

    浏览器支持情况:Enabled by default in desktop Chrome 39  一句话回答这个问题是:Promise,Thunks.为什么没有Generators?因为Generat ...