G1收集器—Garbage First Collector
官方文档地址:点击访问
1 背景
- 吞吐量
吞吐量关注的是,在一个指定的时间内最大化一个应用的工作量
如下方式来衡量一个系统吞吐量的好坏- 在一小时内同一个事务(或者任务, 请求)完成的次数(tps)
- 数据库一小时可以完成多少次查询
对于关注吞吐量的系统,卡顿是可以接受的,因为这个系统关注长时间的大量任务的执行能力,单次快速的响应并不值得考虑
- 响应能力
响应能力—一个程序或者系统对请求是否能够及时响应,比如- 一个桌面UI能多块地响应一个事件
- 一个网站能够多快返回查询的数据
- 数据库能够多快的返回查询的数据
对于这列对相应能力敏感的场景,长时间的停顿是无法接受的
2 简介
- G1收集器是一个面向服务端的垃圾收集器,适用于多核处理器,大内存容量的服务器
- 它满足短时间GC停顿的同时达到一个较高的吞吐量
- JDK 7以上版本适用
设计目标
- 与应用线程同时工作,几乎不需要STW(与CMS类似)
- 整理剩余空间,不产生内存碎片(CMS只能在Full GC时,用STW整理内存碎片)
- GC停顿更加可控
- 不牺牲系统的吞吐量
- GC不要求额外的内存空间(CMS需要预留空间存储浮动垃圾)
设计规划—替换掉CMS
G1在某些方面弥补了CMS的不足,比如
- CMS使用的是Mark-Sweep算法,自然会产生垃圾碎片
- G1基于Copying算法,高效的整理剩余内存,而不要管理内存碎片
另外,G1提供多种手段,以达到对GC停顿时间的可控
- Hotspot虚拟机的主要构成
3 G1收集器的堆结构
- 整个堆被划分为一个个相等的不连续的内存区域(regions),每个region都有一个分代的角色
- Eden
- Survivor
- Old
- 对每个角色的数量并没有强制的规定,也就是说对每个分代内存的大小,可以动态变化
- G1最大的特点就是高效的执行回收,优先去执行那些大对象可回收的区域(region)
G1使用了GC停顿时间可预测的模型来满足用户设定的GC停顿时间,根据用户设定的目标时间,G1会自动的选择哪些region要清除,一次清除多少个region
G1从多个region中复制存活的对象,然后集中放入到一个region, 同时清除, 整理内存(copying收集算法)
4 G1对比其他垃圾收集器
- 对比使用Mar