资讯专栏INFORMATION COLUMN

[JVM 相关] Java 新型垃圾回收器(Garbage First,G1)

Jason / 1219人阅读

摘要:适用收集场景新生代收集老年代收集并行收集器又叫吞吐量收集器应用于多核系统。它是为了平衡延时和吞吐量之间的一种最优关系。

回顾传统垃圾回收器

HotSpot 垃圾收集器实现

Serial Collector(串型收集器)

使用场景,大多数服务器是单核CPU。

适用收集场景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Generation Collection)

Parallel Conllector(并行收集器)

又叫吞吐量收集器(throughput collector)应用于多核系统。

适用收集场景:1. 新生代收集是并行处理。2. 老年代收集和Serial Collector一样。

Parallel Compacting Collector(并行压缩收集器)

The parallel compacting collector was introduced in J2SE 5.0 update 6. The difference between it and the parallel collector is that it uses a new algorithm for old generation garbage collection.

Note : Eventually, the parallel compacting collector will replace the parallel collector.

上述文字中斜体文字告诉我们,这个收集器和上一个并行收集器唯一的不同是在老年代使用了新的算法。

适用收集场景:1. 新生代收集(Young Generation Collector) 和Parallel Collector 相同;2. 老年代收集(Old Generation Collector)

Concurrent Mark-Sweep (CMS) Collector (并发标记清除)

Young generation collections 通常不会造成长时间停顿,然而old generation collections却是是造成长时间停顿的,虽然它不长出现,特别是在大的heaps回收被涉及到的时候。为了处理这个问题,HotSpot JVM 引入了一个叫做 concurrent mark-sweep(CMS) collector,通常也被称为低延时收集器low-latency collector.

适用场景: 仅适用于老年代,新生代处理方式和Parallel Collector相同。

G1目标
G1 is planned as the long term replacement for the Concurrent Mark-Sweep Collector. 计划将G1作为CMS收集器的长久替代物。

它是为了平衡 延时和吞吐量之间的一种最优关系。

G1实现原理
基本属性
和CMS的相同点

CMS Replacement(CMS替代物)

Server "Style" Garbage Collector(服务端垃圾收集器-内存,核数区别)

Parallel 并行

Concurrent 并发

Generational 分代

和CMS的主要区别

Good Throughput 良好的吞吐量

Compacting 压缩

Improved ease-of-use 提升了易用性(更多的JVM参数可用)

Predictable(though not hard real-time) 可预估的,非绝对实时。

基本概念

G1 堆布局

G1将堆分成若干固定大小的Region/区域(区域大小只有1、2、4、8、16和32M),G1的新生代和老年代都是一个无需连续的区域集合,每一个区域独立进行内存的分配和回收,区域是内存管理的基本单元,在某一个时间节点,可能是空闲的,当内存被请求时,内存管理器将空闲的Region分配到某个分代,然后归还应用分配给的空间。

大多数情况下,GC的操作同一时间只会在一个区域进行。

Region 分布

超大对象(Humongous Objects)

下图中跨区域的灰色模块即代表了超大对象,超大对象是指那些空间大小 >=1/2 个区域空间的对象.超大对象有时候会被以下特殊方式处理:

每个超大对象在老年代区域中的连续区域分配。对象分配起始于在连续区域中的首个成员,如果连续区域中的最后一个区域存在剩余空间的话,那么该空间将失去分配的机会,直到其关联的超大对象被完全回收

超大对象的回收通常仅在Cleanup停顿中的Marking结束后、或者在Full GC时。

超大对象的分配可能造成垃圾收集停顿过早地发生(主要是因为空间浪费。)

超大对象绝不会发生移动,即使在没有Full GC的情况下

回收周期

Young-only

Young-only 阶段的垃圾 收集 时逐渐地将老年代的对象填充到当前可用的内存。即将可以提升的新生代对象提升到老年代。

该阶段开始于Young-only的 收集 动作,也就是下图中的蓝色小球,每一个小球都是一次收集动作,也就是提升对象到老年代。Young-only 与Space-reclamation 过渡实际上是开始于老年代空间 *占用* 达到某个阈值,即Heap初始化占用阈值。此时,G1将调度Initial Mark的Young-only收集(蓝色大球),而非常规的Young-only(蓝色小球)收集。

Initial Mark

此类收集开始于标记过程,附带一个常规的Young-only收集,并发标记决定所有在老年代区域中可达的存活对象是否要遗留到Space-reclamation 阶段。当标记过程未结束时,常规的Young-only 收集可能已经发生,等到标记完成时,将伴随着两个特殊的Stop-The-World停顿,RemarkCleanUp.

Remark 停顿

因为在Initial Mark标记过程中,因为它是并发执行,有可能会发生Young-only收集,造成标记数据有误差,因此需要重新标记一次,该过程为串行执行,会造成Stop-The-World.

在Remark 和Cleanup之间,G1将并发地计算出一份对象存活性总结报告,它将在Cleanup停顿阶段更新内部的数据结构

Cleanup 停顿

该停顿同样将完整的回收空闲区域,并且决定Space-reclamation阶段是否需要继续跟踪,如果继续跟随的话,Young-only阶段的完成仅仅做Young-only收集动作。

Space-reclamation

Space-reclamation(空间回收/复用)阶段是回收老年代空间,同时处理新生代。

这个阶段由多个混合的收集动作组成,不仅包含新生代区域,同时也会排除老年代区域的存活对象,当G1发觉依然无法满足空闲的空间请求时,G1会终止本阶段。如果应用消耗完内存,G1将执行Stop-The-World的全堆压缩(Full GC)。

如下图所示:

2种过程是循环往复收集。

G1指令细节
初始空间占用

Initiating Heap Occupancy Percent(IHOP): Initial Mark 收集触发的阈值,为老年代空间定义Heap占用的百分比。

JVM 设置参数:-XX:InitiatingHeapOccupancyPercent

默认情况下,根据标记时间以及老年代在标记周期中的内存分配,G1垃圾收集器将自动抉择理想的IHOP的值。

JVM 失效参数:-XX:-G1UseAdaptiveIHOP

修改区域空间大小

-XX:G1HeapRegionSize

G1 Vs. 传统垃圾回收器

G1 不区分新/老生代,只区分Region

G1 收集分2个阶段Young-onlySpace-reclamation

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75844.html

相关文章

  • 细述 Java垃圾回收机制→Types of Java Garbage Collectors

    摘要:并发标记清除垃圾回收器,使用多个线程来扫描堆内存并标记可被清除的对象,然后清除标记的对象。垃圾回收器应用于大的堆内存空间。它将堆内存空间划分为不同的区域,对各个区域并行地做回收工作。它会通过把重复的值移动到同一个数组来优化堆内存占用。 本文非原创,翻译自Types of Java Garbage Collectors在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的。...

    Julylovin 评论0 收藏0
  • Java 垃圾回收(GC) 泛读

    摘要:在这种消耗很高的状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。 Java 垃圾回收(GC) 泛读 文章地址: https://segmentfault.com/a/1190000008922319 0. 序言 带着问题去看待 垃圾回收(GC) 会比较好,一般来说主要的...

    haoguo 评论0 收藏0
  • 学习JVM必看书籍

    学习JVM的相关资料 《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》 showImg(https://segmentfault.com/img/bVbsqF5?w=200&h=200); 基于最新JDK1.7,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行全面而深入的分析,深刻揭示JVM的工作原理。以实践为导向,通过大量与实际生产环境相结合的案例展示了解...

    shaonbean 评论0 收藏0
  • 你看懂 Elasticsearch Log 中的 GC 日志了吗?

    摘要:但它最大的问题是对内存的浪费,使用率只有。是在区大小超过一定比例后触发,而不是区满。希望本文对你理解的日志有所帮助。 showImg(https://segmentfault.com/img/remote/1460000016494491?w=1280&h=960); 如果你关注过 elasticsearch 的日志,可能会看到如下类似的内容: [2018-06-30T17:57:23...

    glumes 评论0 收藏0
  • 《深入理解java虚拟机》学习笔记系列——垃圾收集器&内存分配策略

    摘要:虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。虚拟机总共运行了分钟,其中垃圾收集花掉分钟,那么吞吐量就是。收集器线程所占用的数量为。 本文主要从GC(垃圾回收)的角度试着对jvm中的内存分配策略与相应的垃圾收集器做一个介绍。 注:还是老规矩,本着能画图就不BB原则,尽量将各知识点通过思维导图或者其他模型图的方式进行说明。文字仅记录额外的思考与心得,以及其他特殊情况 内存...

    calx 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<