文档章节

JVM垃圾收集器笔记整理

木木匠
 木木匠
发布于 2018/04/24 09:48
字数 1855
阅读 690
收藏 22

Serial收集器

历史最久远的垃圾收集器,采用复制算法,依旧是虚拟机运行在Client模式下的默认新生代收集器。

优点:

 1. 简单而高效(与其他收集器的单线程相比);对于限定单个CPU的环境来说,Serial收集器由于没有线程开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

缺点

1.在多核CPU环境下,效率较低,无法在Server模式下发挥优势。

总结

Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择。

ParNew收集器

ParNew收集器其实就是Serial收集器的并行多线程版本,采用复制算法,新生代收集器

优点

1.多线程进行垃圾回收,在多核CPU下相对Serial来说,效率较高。
2.目前除了Serial收集器之外,只有ParNew能与CMS收集器配合。

缺点

1.在单核CPU的环境中,由于存在线程开销,所以效率比较低下。

总结

多线程版本的Serial收集器,在核CPU下能有良好的收集效率,目前依旧是许多运行在Server模式下的虚拟机的首选新生代收集器。
主要的原因有两点,
第一,性能相对来说较好;
第二,目前除了Serial收集器外只有ParNew能与CMS收集器配合使用。

Parallel Scavenge收集器

该收集器也是一个新生代收集器,采用复制算法,是并行的多线程收集器,并且是能够控制吞吐量的收集器。

优点

1.能控制停顿时间,可以自适应调节新生代的大小,Eden与Survivor区的比例等参数。

缺点

1.停顿时间和吞吐量不可兼得,追求小停顿时间,就需要牺牲吞吐量。

总结

Parallel Scavenge 收集器是ParaNew的增强版,能够控制吞吐量和停顿时间,但是只能以一个纬度调整,大吞吐量必然需要长时间停顿;
同时该收集器可以自适应调整内存参数,可以根据监控信息调整新生代大小以及Eden与Survivor区的比例等参数。

Serial Old收集器

该收集器是Serial收集器的老年代版本,单线程收集器,使用“标记-整理”算法。

总结

该收集器的主要意义在于给Client模式下的虚拟机使用,如果用在Server模式下,主要用途有两点:
1.用在jdk1.5之前的版本中于Parallel Scavenge收集器搭配使用;
2.作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure 时候使用。

Parallel Old 收集器

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

总结:

该收集器是在JDK1.6中才开始提供,在此之前,新生代的Parallel Scavenge收集器一直处于比较尴尬的地位。
原因在于,如果新生代选择了Parallel Scavenge收集器,老年代除了Serial Old(PS MarkSweep)收集器外别无选择,而PS+Serial Old的组合在老年代很大的情况下,
这种组合就会很鸡肋甚至都不一定有ParNew+CMSz组合“给力”,
所以Parallel Old的收集器出现后,“吞吐量优先”收集器总算摆脱了尴尬的地位,在注重吞吐量以及CPU资源敏感的场合,都可以考虑Parallel Scavenge+Parallel Old 组合。 

CMS收集器

CMS收集器是一种以获取最短回收停顿时间为目的的收集器。采用“标记-清理”收集算法,收集过程主要包括4个步骤:
1.初始标记
2.并发标记
3.重新标记
4.并发清除
其中,初始标记、重新标记依旧需要“Stop The World”。

优点

并发收集、低停顿。

缺点:

1.CMS收集器对CPU资源非常敏感,由于会占用一部分线程,所以可能会导致程序变慢,总吞吐量会降低。CMS默认启动的线程数是(CPU+3)/4,也就是当CPU在4个以上时候,并发回收时垃圾收集线程不少于25%的CPU资源,并随着CPU数量的增加而下降。
2.CMS收集器无法处理浮动垃圾,可能出现 “Concurrent Mode Failure" 失败导致另一次Full GC的发生。当产生Full GC 时,就需要启用Serial Old 收集器来重新进行老年代的垃圾收集,这样停顿的时间就更长了。
3.由于CMS 采用“标记-清理”算法收集,所以就会造成收集结束后会有大量的空间碎片产生。如果空间碎片过多,会造成分配大对象无法分配内存,不得不提前触发Full GC。不过,CMS提供了碎片化整理的参数来解决这个问题。

G1收集器

G1(Garbage-First)收集器是当今收集技术发展的最前沿成果之一。它是一款面向服务端应用的垃圾收集器。
该收集器独自管理整个java堆,把java堆划分多个大小相等的独立区域(Region),虽然新生代和老年代的概念都保留,但是新生代和老年代却不再是屋里隔离,它们都是一部分Region的集合。
基本回收步骤:
1.初始标记
2.并发标记
3.最终回收
4.筛选回收

特点解析:

1.G1收集器采用“化整为零”的思路进行垃圾回收,G1跟踪各个Region里面的垃圾堆的价值(回收所获得的空间大小以及所花费的时间的比率)大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。这中使用Region划分内存空间以及优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能搞的收集效率。
2.由于划分都是采用Region的形式收集垃圾,那么就会存在Region之间存在对象引用,极端情况下,虚拟机有可能出现全堆扫描的情况,但是虚拟机使用Remembered Set解决这个问题。
G1中每个Region都有一个与之对应的Remembered Set ,虚拟机发现程序在对Reference类型的数据进行写操作的时候,检查Reference引用的对象是否处于不同的Region之中(在分代的例子中就是检查是否老年代的对象引用了新生代中的对象),如果是,变通过CardTable把相关引用信息记录到被引用对象所属的Region的Remembered Set之中。
当进行内存回收时,在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描,也不会有遗漏。

优点:

1.并行与并发
2.空间整合
3.可预测的停顿

缺点:

G1收集器目前在商用层面的案例较少,没有表现出足够的性能优势,随着后续对G1的优化,这一问题应该可以解决。

© 著作权归作者所有

木木匠
粉丝 103
博文 30
码字总数 65486
作品 0
广州
高级程序员
私信 提问
聊聊JAVA虚拟机中的垃圾收集器

前言 JAVA虚拟机的垃圾收集器是虚拟机内存的清道夫,它的存在让JAVA开发人员能将更多精力投入到业务研发上。了解垃圾收集器,并利用好这个工具,能更好的保障服务稳定性。这篇文章通过分析J...

lilugoodjob
2018/07/02
0
0
Java虚拟机基础——4内存回收机制

Java虚拟机整体篇幅如下: Java虚拟机基础——1Java的内存模型 Java虚拟机基础——2JVM运行时数据区 Java虚拟机基础——3类加载机制 Java虚拟机基础——4内存回收机制 本篇文章的内容如下: ...

隔壁老李头
2018/10/03
0
0
My java——JVM(垃圾回收)四

续My java——JVM(内存域) 中讲述了Java在JVM中的内存使用,其实在我们出来java程序时基本上有两个地方的内存处理 一是栈、二是堆,JVM会自动回收堆中的内存,也就我们所说的垃圾回收,那J...

tngou
2013/03/20
309
0
《JAVA核心知识》学习笔记(JVM)-1

JVM (1) 基本概念: JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。 JVM 是运行在操作系统之上的,它与硬件没有直...

Shingfi
07/23
47
0
java 面试知识点笔记(五)垃圾回收 中篇

Stop-the-World JVM由于要执行GC而停止了应用程序的执行(处于stop-the-world的状态时,除了GC的线程以外的所有线程都处于等待状态,知道GC完成) 任何一种GC算法中都会发生 多数GC优化通过减...

断风格男丶
05/16
7
0

没有更多内容

加载失败,请刷新页面

加载更多

java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
35分钟前
5
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
36分钟前
8
0
Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

编者注:这是一个非常流氓的 WIFI 网络钓鱼工具,甚至可能是非法的工具(取决于你的使用场景)。在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动。使用时请遵...

红薯
今天
46
1
MongoDB 4 on CentOS 7安装指南

本教程为CentOS x86_64 7.x操作系统下,MongoDB Community x86_64 4.2(GA)安装指南。 安装方式一:yum repo在线安装 [此方式较为简单,官方推荐] Step1:新建MongDB社区版Yum镜像源。 # vim ...

王焱君
今天
7
0
go-micro 入门教程1.搭建 go-micro环境

微服务的本质是让专业的人做专业的事情,做出更好的东西。 golang具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。go-micro是基于golang的微服务编程框架,go-micro操作简单...

非正式解决方案
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部