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

并行(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. linux安装mongodb,设为全局和后台启动

    curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.5.tgz # 下载 tar -zxvf mongodb-linux ...

  2. opencv轮廓提取、轮廓识别相关要点

    1.轮廓提取 src = cv2.imread("***.jpg", cv2.IMREAD_COLOR) gray = cv2.cvtColor(src ,cv2.COLOR_BG ...

  3. JETSON TK1 ~ 控制GPIO

    首先建立个存放gpio代码的文件夹,CD到该文件夹. git clone git://github.com/derekmolloy/boneDeviceTree/ 解压后会出现几个文件 GPIO文件夹 ...

  4. LeetCode:矩形区域【223】

    LeetCode:矩形区域[223] 题目描述 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积. 每个矩形由其左下顶点和右上顶点坐标表示,如图所示. 示例: 输入: -3, 0, 3, 4, ...

  5. 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数

    题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...

  6. jzyz集训 0612

    今天闵神找的题,题目质量还算不错,就是有些偏套路了. 第一题:定义一个排列是合法当且仅当这个排列中不存在大于2的循环节,询问有多少长度为n的排列是合法的且B排列是该排列的子序列. 恩...这题目其实不 ...

  7. awk输出匹配内容的所在列数

    想要知道 TCPAbortFailed 所在列数 cat /proc/net/netstat  > test awk '/TCPAbortFailed/ {for (i=1;i<=NF;i ...

  8. Strom 消息处理机制 中英对照翻译 (Storm如何保证消息被完全处理)

    官方链接: http://storm.incubator.apache.org/documentation/Guaranteeing-message-processing.html What does ...

  9. BZOJ(begin) 1328 [Usaco2003 Open]Jumping Cows:贪心【波峰波谷模型】

    题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1328 题意: 给你一个长度为n的正整数序列. 可以选任意个数字,只能从左往右选. 偶数 ...

  10. Bootstrap简单介绍

    一.一个小知识点 1.截取长屏的操作 2.设置默认格式 3.md,sm, xs 4.空格和没有空格的选择器 二.响应式介绍 - 响应式布局是什么? 同一个网页在不同的终端上呈现不同的布局等 - 响应式 ...