首页 > 试题广场 >

介绍下G1收集器?

[问答题]
G1收集器是一个多线程的采用标记清除算法的,面向混合收集(同时收集新生带和老年带)的一个垃圾收集器。G1收集器将整个堆内存区域划分为多个大小相等的region,以region为单位进行垃圾收集并获取每个region的收集效率和收集收益,通过一张优先级表对其进行维护。同时每个region中维护了一个remember set用来存储该分区中的对象所引用的对象在其他分区的位置来避免在做可达性分析算法时全堆扫描。G1垃圾收集器垃圾回收主要包括四个流程:1,初始标记,2,并发标记(类似于CMS),3,最终标记在并发标记中维护了一个remember set log用来记录在该阶段发生变化的对象引用关系,在该阶段就是将该信息同步到最终标记信息中。4,并发筛选回收:根据优先级表选择分区进行垃圾回收,用户线程不停顿。
发表于 2022-05-18 17:38:33 回复(4)
面向堆内任何部分组成回收集回收,衡量标准是哪块内存中垃圾数量最多、回收收益最大
编辑于 2022-06-17 14:37:07 回复(0)

G1

发表于 2022-07-05 16:25:02 回复(3)
G1回收器是一个多线程,可以同时收集新生代和老年代的一个垃圾收集器。G1将整个堆内存区域划分为多个大小相等的region,追踪每个Region可以回收对象的大小和预估时间,并以region为单位进行垃圾收集并获取每个region的收集效率和收集收益,通过一张优先级表对其进行维护。 G1可以设置垃圾回收的预期停顿时间(STW)。 G1的年轻代和老年代空间并不是固定的,当现有年轻代分区占满时,JVM会分配新的空闲Region加入到年轻代空间,老年代也是如此。 G1 GC的回收过程中有内存整理,理论上不会产生内存碎片! G1垃圾收集器垃圾回收主要包括四个流程:1,初始标记 2,并发标记(类似于CMS) 3,最终标记 4,并发筛选回收:根据优先级表选择分区进行垃圾回收,用户线程不停顿。
发表于 2022-08-29 20:39:40 回复(0)
G1收集器是一款具有跨时代意义的收集器,在JDK9之后官方就默认推荐G1收集器而不是ParllNew+CMS的组合了。下面将详细介绍G1收集器。 1.这是第一款摒弃了分代模型的收集器(物理上不分代,逻辑上分代),摒弃了分代模型而采用了Region区域的形式(Region 的大小为 1-32M 之间的2的指数倍),同时为了解决之前收集器STW(Stop The World)的时间过长问题, G1首次实现了可以自定义STW时间的过程,叫做“停顿预测模型” 2.G1的步骤:A.初始标记:和所有的收集器一样,标记所有的GC Roots对象(需要STW),B.并发标记:从GC Roots对象开始做可达性分析,是和用户线程并发进行的。 C.最终标记:修改因为并发标记期间产生的一些引用的变化,需要STW,并且这个步骤和CMS的最终标记有所不同,CMS处理这种的行为是增量更新,而G1采用的是读原始快照(SATB)算法。 D.筛选回收:需要STW,这是和CMS不同的点,由于G1采用的是标记-复制算法。 会涉及到存活对象的移动,所以需要STW,但是CMS采用的是标记-清除算法,在这个阶段不需要STW。 在这一阶段中,G1会在“停顿预测模型”的时间范围内,选出性价比最好的区域进行回收,不会一次回收所有的区域。 3.G1回收的时机,和CMS一样由于是并发收集器,所以不可能等到不能分配对象时在进行回收,而是当G1堆中空余内存小于一个阈值时,进行回收,一般是30%的空间。和CMS一样这种 机制有一个问题,那就是在进行G1期间用户线程持续请求内存达到了OOM(OutOfMemoryError)时会进行Full GC并且在Full GC期间全是STW的。 4.(未回答)G1的回收策略:和之前的GC不同之前的是一些Young GC ,Old GC, Full GC. G1采用的是混合回收策略(Mixed GC).它会将内存中所有需要回收的区域来组成回收集(Collection Set CSet). 这个回收集就是G1需要回收的区域(STW时间不超过停顿预测模型中的时间).其中G1有一块存放大对象的区域(Humongous Region),当对象所需的空间达到Region的一半时,会将其放入这个区域中 5.G1和CMS的区别:G1采用的是标记-复制算法,不会产生大量的内存碎片,CMS采用的是标记-清除算法。 会产生大量的内存碎片。同时由于G1需要对对象内存进行移动, 所以在最后的筛选回收阶段是需要STW的,CMS不需要对对象的内存进行移动,所以在最后的并发清理阶段不是STW的。 两种收集器都是为了解决在较大的堆内存中(8G左右),减少STW的停顿时间。在两种GC的选择问题上,在JDK8中推荐使用CMS+ParllNew的组合。在JDK9之后的版本中更推荐G1. 这是由于CMS有一个无法解决的问题,就是它是使用的标记-清除算法。 会导致大量的内存碎片,在多次GC后可能会出现CMS回收失败,进而触发Serial Old收集器来收集整理老年代。
编辑于 2023-03-20 12:26:21 回复(0)
G1收集器是一个多线程,整体采用标记-整理算法,面向混合收集(同时收集新生代和老年代)的一个垃圾收集器。 采用分Region堆内存布局,将堆划分为多个大小的Region,其内存回收以Region作为基本单位。 替代了传统的CMS收集器,支持压缩整理避免内存碎片。
发表于 2025-06-07 16:27:33 回复(0)
G1收集器是一款面向服务器的垃圾收集器,主要针对配备多颗处理器以及最大容量空间的机器,以极大概率满足回收停顿的要求的同时,还具备高吞吐量的性能,它具备一下的特点 并发并行:G1收集器充分利用CPU,多核条件下的硬件优势,使用多个CPU缩短了stop-thr-word停顿时间,不同于部分收集器需要停顿java线程,G1收集器可以通过并发的方式让java程序继续运行 分代收集:G1收集器不需要其他收集器可以独立的管理堆,但是也保留了分代的概念 空间整合:从整体来看G1收集器基于标记整理算法实现,从局部来看基于复制算法实现 可预测的停顿:G1收集器在满足低停顿时间发同时,还可以建立一个可预测停顿时间模型,可以明确指定一个长度为M毫秒的时间片段内 G1收集器在后台维护了一个优先队列,每次根据运行的收集时间,优先收集价值最大的region
发表于 2024-05-20 09:33:45 回复(0)
- G1面向服务器的垃圾回收器,与CMS注重停顿时间不同,G1更注重cpu的吞吐量,所以适用于服务器的垃圾回收 - 原理:三色标记+SATB(原始快照) - 特点 - 并发与并行:可以并发的标记,又因为用在服务器中,可以用服务器中多核的优势做到并行运行,可以使用其中一个cpu进行gc其余进行运行 - 可预测的停顿时间:G1将堆中物理的分区转换为逻辑上的分区,将region做为每次回收的最小单位,可以通过region计算出所需要的时间 - 分代收集:G1不仅局限于某个分区,可以进行部分收集、混合收集 - 过程:初始标记(STW)、并发标记、最终标记(STW)、筛选回收(STW)(按照成本、价值、停顿时间来回收) - 空间整合:整体是标记整理,局部是标记复制
发表于 2022-08-10 11:01:40 回复(0)
G1收集器是一个多线程的采用标记清除算法的、面向混合收集(同时收集新生代和老年代)的一个垃圾收集器。G1收集器将整个堆内存区域划分为多个大小相等的region,以region为单位进行垃圾收集并获取每个region的收集效率和收集收益,通过一张优先级表对其进行维护。同时每个region中维护了一个remember set用来存储该分区中的对象所引用的对象在其他分区的位置来避免在做可达性分析算法时全堆扫描。G1垃圾收集器垃圾回收主要包括四个流程:1)初始标记。2)并发标记。3)最终标记在并发标记中维护了一个remember set log用来记录在该阶段发生变化的对象引用关系,在该阶段就是将该信息同步到最终标记信息中。4)并发筛选回收:根据优先级表选择分区进行垃圾回收,用户线程不停顿。
发表于 2022-07-20 10:11:24 回复(0)
(1)G1收集器面向堆内存任何部分来组成回收集进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC模式。 (2)G1 基于标记--整理算法的多线程垃圾收集器, 不会产生空间碎片、CPU利用率更高 (3)G1收集器的运作过程大致可划分为以下四个步骤:初始标记、并发标记、最终标记、筛选回收。其中,初始标记和最终标记阶段仍然需要停顿所有的线程,但是耗时很短。
发表于 2025-03-18 22:05:39 回复(0)
回收整个堆,使用标记整理算法。 初始标记STW,并发标记,重新标记STW,筛选回收STW
发表于 2025-03-09 19:27:17 回复(0)
G1收集器是一个多线程的采用标记清除算法的,面向混合收集(同时收集新生带和老年带)的一个垃圾收集器。G1收集器将整个堆内存区域划分为多个大小相等的region,以region为单位进行垃圾收集并获取每个region的收集效率和收集收益,通过一张优先级表对其进行维护。同时每个region中维护了一个remember set用来存储该分区中的对象所引用的对象在其他分区的位置来避免在做可达性分析算法时全堆扫描。G1垃圾收集器垃圾回收主要包括四个流程:1,初始标记,2,并发标记(类似于CMS),3,最终标记在并发标记中维护了一个remember set log用来记录在该阶段发生变化的对象引用关系,在该阶段就是将该信息同步到最终标记信息中。4,并发筛选回收:根据优先级表选择分区进行垃圾回收,用户线程不停顿。
发表于 2025-03-05 20:05:17 回复(0)
整堆、Region、标记整理
发表于 2024-09-04 16:47:41 回复(0)
G1回收器采用混合垃圾收集算法,新生代与老年代一起收集。将堆内存分为若干区,当eden区满会进行垃圾回收,存活对象进入存活区,多次存活的对象晋升老年代。当老年代内存占用过多,会并发标记存活对象,混合回收。
发表于 2024-08-16 20:06:20 回复(0)
G1回收器是JDK9之后jvm默认回收器,采用的是混合垃圾收集算法,即新生代和老年代一起收集的方式(mixed gc); G1回收器将堆内存分割成若干个相同的区域,每个区域都能成为eden区、from区、to区等,当eden区满了后就会进行一次gc,存活对象进入存活区,经过多次gc后存活区的的一部分对象晋升老年代,当老年代内存占用过多,会并发标记存活对象,最终进行mixed GC.
发表于 2024-07-10 22:23:54 回复(0)
JDK9之后默认为G1垃圾回收器,它是整堆垃圾回收器 它没有将新生代和老年代分为两个不同的区域而是一整块连续且大小相等的区域 新的对象会创建在新生代的伊甸园区,如果伊甸园内存不足则会放入其中的幸存者区,当幸存者区满的时候会发生youngGC,此时是标记复制回收算法,默认搬运次数是15次,当到达15次会进入老年代,进入老年代: 到达15次,大对象直接进入,如果在Survivor空间中小于等于某个年龄的所有对象大小的总和大于Survivor空间的一半时,那么就把大于等于这个年龄的对象都晋升到老年代。
编辑于 2024-04-02 18:15:33 回复(0)
是采用的是混合垃圾收集算法 是JVM默认的垃圾收集器 将堆中分成许多大小相等的区域,分为eden、from、to ,进行垃圾回收,当eden园区满后,进行一次gc,存活的留在eden 多次gc后,仍在eden的对象进入老年代,当老年代内存满后,并发标记对象,进行一次mixed gc
发表于 2024-03-16 15:21:35 回复(0)
编辑于 2024-03-08 14:09:51 回复(0)
49
发表于 2023-03-07 10:31:14 回复(0)
1:吞吐量与响应时间兼顾。2:划分多个区域,每个区域都可以充当,eden,survivor,old,homongous。3:新生代内存不足,标记复制算法(STW),初始标记在新生代标记。4:并发标记(老年代占用堆空间比例达到阈值),old并发标记,重新标记需要(STW)。5:混合收集:并发标记完成,Eden,survivo,old参与混合收集,其中old根据暂停时间,回收部分有价值区域,采用复制算法(stw),如果当垃圾回收赶不上垃圾产生的时候才会使用Full GC
编辑于 2023-02-24 15:06:50 回复(0)