GC

GC实际是内存的申请与回收的管理控制模块。

GC的背景和一般原理

内存仓库中,仓库与仓库之间循环调用,导致使用数永远不为0,从而内存得不到释放,累计下去会导致内存溢出,所以需要GC来控制和管理内存空间的申请与释放。

标记清除算法(Mark and Sweep)

Marking:遍历所有可达对象,并在本地内存(native)中分门别类几下。

Sweeping:这一步保证了,不可达对象所占用的内存,在之后进行内存分配时可以重用。

标记与清除之间,内存空间状态变更问题,引入STW,stop world。GC暂停。

堆分代(Heap)

年轻代、老年代、新生代、S0(from)、S1(to)

大部分新生对象很快无用;

存活较长时间的对象,可能存活更长时间。

不同种类堆空间中使用的GC策略不同。

不同的GC策略

标记清除算法Mark-Sweep(典型:老年代)

复制算法Mark-Copy(典型:年轻代)

(新生代)Eden区+S0,标记后复制到S1区,然后全部删除Eden区和S0

标记清除整理算法(标记-清除-整理Mark-Sweep-Compact)

GC分类

串行GC(Serial GC):

-XX:+UseSerialGC 配置串行GC

-XX:+UseParNewGC 改进版本的串行GC,可以配合CMS使用

年轻代使用标记复制算法,对老年代使用标记清除整理算法,触发STW事件之后,则全线停止

并行GC(Parallel GC):

-XX:+UseParallelGC

-XX:+UseParallelOldGC

-XX:+UseParallelGC -XX:+UseParallelOldGC

------上述三种写法,同样的效果

--XX:ParallelGCThreads=N 来指定GC的线程数,默认值为CPU的核心数。

年轻代和老年代的垃圾回收都会触发STW事件。

年轻代使用标记复制算法,老年代使用标记清除整理算法

CMS GC(Mostly Concurrent Mark and Sweep Garbage Collector),jdk8默认GC策略

+XX:+UseConcMarkSweepGC

年轻代,并行STW方式的标记复制算法;老年代使用并发标记清除算法。

CMSGC设计目标是避免在老年代垃圾收集的时候出现长时间的卡顿。

1、不对老年代进行整理,而是使用空闲列表(free-lists)来管理内存空间的回收。

2、在标记清除阶段,大部分工作和应用线程一起并发执行。

CMSGC处理的六个阶段

1、Initial Mark(初始标记)伴随着STW,初始化标记GCROOTS(所有根对象),以及被年轻代中所有存活对象所饮用的对象,老年代中所有可直达节点。

2、Concurrent Mark(并发标记)遍历老年代,标记所有存活对象。

3、Concurrent Preclean(并发预清理)并发处理过程中,被标记的对象发生了变动,则变动区域被称作脏卡区域(Card Marking)

4、Final Remark(最终标记)GC事件中的第二次(也是最后一次)STW停顿。处理脏卡区域,做最精准标记

5、Concurrent Sweep(并发清除)清除未被标记的对象空间

6、Concurrent Reset(并发重置)去除标记、回收空间。

G1 GC(Garbage-First)jdk9之后默认G1GC

+XX:+UseG1GC -XX:MaxGCPauseMillis=50

GC最大暂停时间毫秒单位

设计目标:将STW的停顿时间和分布,变成可预期且可配置的。

堆不再分成年轻代和老年代,而是划分为多个(通常为2048个)可以存放对象的小块堆区域(smaller heap regions)。每个小块可能一会被定义为Eden区,一会被指定为Survivor区或者Old区。在逻辑上,所有的Eden区和Survivor区合起来就是年轻代,所有的Old区加起来就是老年代。垃圾处理时,每次处理所有年轻代和部分老年代的区域。

年轻代和老年代不再是物理内存空间的概念,而是分区合集的逻辑概念。

ZGC/Shenandoah GC(RedHead中jdk8以及之后支持ShenandoahGC)

来自于PanselessGC(Azul公司)

ZGC

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx16g

主要特点:

1、GC最大停顿时间不超过10ms

2、堆内存支持范围广,小至几百MB的堆空间,大至4TB的超大对空间(JDK13升至16TB)

3、与G1相比,应用吞吐量下降不超过15%

4、当前只支持Linux/x64位平台,JDK15之后支持Mac与Windows系统

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 吞吐量 垃圾回收算法(6 个字太长了,以下简称 GC)算是对程序完成它想做的事情的一种辅助,并不是程序的主要目的(...
    tracy_668阅读 5,130评论 0 3
  • 内容主要如下: GC 基础原理,涉及调优目标,GC 事件分类、JVM 内存分配策略、GC 日志分析等。 CMS 原...
    猿小将阅读 3,483评论 0 0
  • 概述 本文介绍GC基础原理和理论,GC调优方法思路和方法,基于Hotspot jdk1.8,学习之后将了解如何对生...
    caison阅读 5,278评论 1 2
  • Catalog 1 怎么解决OOM?/ 怎么排查OOM?/ JVM调优1.1 JDK自带工具1.2 阿里开源JVM...
    allen锅阅读 3,339评论 0 1
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 13,602评论 0 11

友情链接更多精彩内容