JVM各垃圾收集器对比

本随笔是《深刻理解Java虚拟机 JVM高级特性与最佳实践》读书笔记。算法

1.JDK1.7以后的HotSpot虚拟机所包含的全部收集器以下:并发

 

解读:布局

1. 总共有7种垃圾收集器学习

2.Serial,ParNew,Parallel Scavenge 负责堆年轻代中的内存回收网站

3.Serial Old,CMS,Parallel Old 负责堆老年代中的内存回收spa

4.G1分代回收,能独立管理整个GC堆线程

5.两个收集器中间存在连线的,说明可以配合工做server

 

各个收集器对比对象

名称blog

收集算法

工做区域

可配合对象

线程

并发

适用场合

优缺点

Serial

复制算法

新生代

CMS;

Serial Old

CPU;

Client模式下

缺:stop the world;

优:简单高效,没有线程交互开销,专一于GC;

ParNew

复制算法

新生代

CMS;

Serial Old

CPU;

Server模式下

缺:stop the world

优:并行并发GC

Parallel Scavenge

复制算法

新生代

Serial Old;

Parallel

Scavenge

吞吐量控制,Client,server都可以

主要关注吞吐量,经过吞吐量的设置控制停顿时间,适应不一样的场景

Serial Old

标记整理算法

老年代

Serial,ParNew,Parallel  Scavenge

主要Client模式下

缺:stop the world

Parallel Old

复制算法(Parallel Scavenge老年代版本)

老年代

Parallel Scavenge

吞吐量控制,Client,server都可以

主要关注吞吐量,经过吞吐量的设置控制停顿时间,适应不一样的场景

CMS(Concurretn Mark Sweep)

标记清除算法

老年代

Serial,ParNew,

Serial Old是其备选方案

互联网站;B/S系统服务端

缺:CPU资源敏感,没法处理浮动垃圾,产生大量内存碎片

优:并发收集,低停顿

G1

总体基于标记整理算法

新生代&老年代

 

面向服务端应用

优:并行与并发,

分代收集,空间整合(标记整理算法),可预测停顿

 

名词解释

并行(Parallel):只多条垃圾收集线程并行工做,但此时用户线程处于等待状态,也就是stop the world.

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

 

Garbage First收集器

现最流行的是G1(Garbage First)收集器,也是当今收集器技术发展的最前沿成果之一,现重点学习一下。

1.优势

  • 并行与并发;
  • 分代收集;虽然G1能够不须要其余收集器配合而独立管理整个GC堆,可是它可以采用不一样的收集算法去处理新建立的对象和已经存活一段时间,熬过屡次GC的对象。
  • 空间整合;G1总体是基于标记-整理算法。因此运行期间不会产生内存碎片,收集后能提供规整的可用内存。在分配打对象时不会由于没法找到连续内存而触发下一次GC。
  • 可预测的停顿;G1除了追求低停顿之外,还能创建可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片断内,消耗在垃圾收集上的时间不超过N毫秒。

 

2.特色

  • 对堆的划分;G1以前的收集器对内存的收集都是新生代或者老年代,而G1不在这样。使用G1收集器时,Java堆的内存布局就和其余收集器有很大区别,他将整个堆划分红多个大小想等的区域(Region).虽然还有概念上的新生代和年老代,但他们之间已经不在物理隔离了,他们都是一部分Region(不须要连续的)的集合。
  • 回收等级;G1能实现可预测的停顿是由于它能够避免对堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾的价值(回收的内存大小和时间的比值)大小,在后台维护一个优先列表,每次优先回收价值最大的Region,这也是可预测停顿的实现的原理。

 

3.须要思考的问题

 G1把内存化整为零,将整个堆划分为多个Region。那么垃圾收集真的就是以Region为单位进行的吗?听起来瓜熟蒂落,仔细想一想其实不是,Region不多是孤立的。一个对象分配在某个Region中,但它并非只能被本Region中的其余对象引用,而是能够为整个堆中的任意其余对象引用。那么在利用可达性分析判断对象是否存活时,岂不是要扫描整个Java堆才能保证准确性?此类问题在其余收集器中也会出现,新生代年老代一样面临此类问题。

  此类问题的JVM采用Remembered Set来避免全堆扫描。(包括新生代年老代的解决思路)。Remembered  Set工做机制,详见 《深刻理解Java虚拟机 JVM高级特性与最佳实践》第三章3.5.7

 

4.运做步骤

  • 初始标记;
  • 并发标记
  • 最终标记
  • 筛选回收
相关文章
相关标签/搜索