首页 > 试题广场 >

请你讲下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)

G1

发表于 2022-07-05 16:25:02 回复(3)
面向堆内任何部分组成回收集回收,衡量标准是哪块内存中垃圾数量最多、回收收益最大
编辑于 2022-06-17 14:37:07 回复(0)
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面向服务器的垃圾回收器,与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)
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)
G1垃圾回收器(Garbage First)收集器:面对服务器的垃圾收集器,主要针对配备多处理器以及大容量内存的机器,以极高的概率满足GC停顿时间要求,并兼备高吞吐量的性能特征. 通过多线程并发收集,运行大致步骤为: 1.初始标记:(会有停顿产生) 2.并发标记:在并发标记时,用一个闭包结构去记录可达对象,同时由于用户线程并发运行,闭包结构不能保证可达对象的实时性,所以会有最终标记 3.最终标记:修正在并发标记时用户线程导致标记变动的对象(会有停顿产生) 4.筛选回收 与CMS收集器类似(但是CMS是通过"标记-清除"算法实现,在回收结束会产生大量空间碎片),不同的是G1收集器是通过"标记-整理"算法实现,局部可以看做是"标记-复制"算法,G1维护了一个优先列表,在有限的时间里,根据优先列表的优先级,选择价值最大的一块区域进行回收.
编辑于 2023-02-15 17:54:38 回复(0)
G1是整堆垃圾回收器,他取消了年轻代与老年代的物理划分,但是仍属于分代回收器,他将堆分成若干个逻辑区域,就是一个个Regin,一部分用做新生代,一部分用做老年代,还有存放大对象的区域,回收的时候和CMS类似,先遍历所有的对象,标记引用情况,然后在清除,最后对区域进行复制移动,整合垃圾碎片。
发表于 2022-12-26 20:43:29 回复(0)
G1收集器是一个采用多线程的标记清楚算法的收集器,面向回合收集的一个垃圾收集器,他将内存分为很多大小相等的region,他每次都是以这个块为单位来进行垃圾收集的,他还维护了一张优先级表来。g1在垃圾回收有四个阶段 初始标记,重新标记,最终标记,并发清理。他使用了增量更新的策略去保证跟可达性算法的准确。
发表于 2022-11-17 11:48:38 回复(0)
采用增量回收的机制,将内存区域划分为一个个的region为单位进行回收,同时也采用CMS的分阶段进行回收,以及分代回收,不同对象的生命周期不同,采用不同的垃圾回收方法,首先扫描region,将活跃对象按照大小进行排序后,按照回收的价值对对象进行排序回收,优先回收活跃对象小的
发表于 2022-09-08 16:54:47 回复(0)
G1回收器是jvm默认回收器,他的特性是mixed gc也就是混合收集,新生代跟老年代一起收集的方式。G1回收器将堆内存分割成若干个相同的区域,每一个区域都能成为eden区、from区、to区等,在eden区满了就会发起一次gc,存活对象进入存活区,经过多次gc后存活区的一部分对象晋升老年代,当老年代内存占用过多,会并发标记存活对象,最终进行mixed GC
发表于 2022-09-03 11:05:06 回复(0)