jvm垃圾回收算法有哪些?
5 个回答
世间万物,唯有过往伤人最深。冰心月**1. 标记清除算法** 先标记需清除的对象,之后统一回收。这种方法效率不高,会产生大量不连续的碎片。 **2. 标记整理算法** 先标记存活对象,然后让所有存活对象向一端移动,之后清理端边界以外的内存。 **3. 标记复制算法** 将可用内存按容量划分为大小相等的两块,每次只使用其中一块。当使用的这块空间用完了,就将存活对象复制到另一块,再把已使用过的内存空间一次清理掉。 ### 分代收集算法 根据对象存活周期将内存划分为几块,不同块采用适当的收集算法。 - **新生代**:标记复制算法 - **老年代**:标记清除或标记整理算法 ### 垃圾收集器 **Serial 垃圾收集器** 单线程串行收集器,垃圾回收时必须暂停其他线程。 - 新生代:标记复制算法 - 老年代:标记整理算法 **ParNew 垃圾收集器** Serial 垃圾收集器的多线程版本。 - 新生代:标记复制算法 - 老年代:标记整理算法 **Parallel Scavenge 垃圾收集器** 注重吞吐量,适合高性能场景。 - 新生代:标记复制算法 - 老年代:标记整理算法 **CMS 垃圾收集器** 注重最短停顿时间,采用标记清除算法,分为初始标记、并发标记、并发预清理、并发清除、并发重置几个阶段。 **G1 垃圾收集器** 将堆划分为多个独立的区域(Region),新生代和老年代不再物理隔离,分为初始标记、并发标记、最终标记、筛选回收四个阶段。发布于 2024-02-04 06:41 •IP属地 四川举报评论收藏
我疯狂地奔跑,只想为你承担一切的伤害,我竖起了山丘,不愿你看见我丑陋的脸庞。许立国垃圾收集算法是内存管理中的重要技术,常见的垃圾收集算法包括标记-清除算法、复制算法、标记-压缩算法和分代收集算法。以下是对这些算法的简要介绍: 1. **标记-清除算法(Mark-Sweep)**: - **过程**:算法分为“标记”和“清除”两个阶段。首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象。 - **优点**:实现简单,不需要移动对象。 - **缺点**:容易产生内存碎片,导致内存利用效率低下。 2. **复制算法(Copying)**: - **过程**:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完后,将存活的对象复制到另一块,然后清理掉已使用过的内存。 - **优点**:有效避免了内存碎片问题,适合对象存活率低的场景。 - **缺点**:需要两倍的内存空间,浪费了一半的内存。 3. **标记-压缩算法(Mark-Compact)**: - **过程**:标记过程与标记-清除算法相同,但在清除阶段不是直接回收对象,而是将所有存活的对象移动到内存的一端,清理端边界以外的内存。 - **优点**:避免了内存碎片问题,提高了内存利用效率。 - **缺点**:对象的移动增加了额外的开销。 4. **分代收集算法(Generational Collection)**: - **过程**:将Java堆划分为新生代和老年代,根据对象的存活时间采用不同的垃圾收集算法。新生代对象存活时间短,采用复制算法;老年代对象存活时间长,采用标记-清除或标记-压缩算法。 - **优点**:根据对象的特点选择最适合的收集算法,提高了垃圾收集的效率。 - **缺点**:需要维护不同代的对象,增加了实现的复杂性。 这些垃圾收集算法在不同的场景下有不同的适用性,现代垃圾收集器通常会结合多种算法,以达到最佳的性能和效率。编辑于 2024-01-19 16:42 •IP属地 北京举报评论收藏
请优先考虑优先考虑你的人。吉尔伯特常见的内存分配策略如下: 1. **新生代分配**:大多数对象在新生代的 Eden 区分配,当 Eden 区没有足够空间时,会触发一次 Minor GC。 2. **大对象直接进入老年代**:大对象需要连续的内存空间,无法在新生代容纳时,会直接在老年代分配。 3. **对象晋升老年代**:对象在新生代经过一次 Minor GC 仍然存活,且可以被 Survivor 区容纳,年龄设为 1,每经历一次 Minor GC 年龄增加 1,当年龄达到一定值(默认 15),对象会被晋升到老年代。 4. **Survivor 区晋升规则**:如果 Survivor 区中相同年龄的对象总大小超过 Survivor 的一半,年龄不小于该年龄的对象会直接晋升到老年代。 5. **老年代分配担保**:在进行 Minor GC 之前,JVM 会检查老年代的最大可用连续空间是否大于新生代对象总空间,如果满足则进行 Minor GC,否则检查 `HandlePromotionFailure` 参数是否允许担保失败,如果允许则会根据历次晋升老年代对象的平均大小决定是否继续 Minor GC,否则会触发 Full GC。发布于 2023-06-12 11:27 •IP属地 河北举报评论收藏
用眼睛是看不到事物的本质的,只有心灵才能够洞察一切。hello### G1算法 G1(Garbage-First)垃圾回收算法是JDK 1.9后的默认垃圾回收器,旨在保持高回收率的同时减少停顿时间。其主要特点如下: 1. **增量式清理**:G1每次只清理一部分内存,而不是全部清理,以保证停顿时间不会过长。 2. **取消年轻代与老年代的物理划分**:虽然取消了物理划分,但仍属于分代收集器。G1将堆分为若干个逻辑区域(region),一部分用于年轻代,一部分用于老年代,还有一些用于存储巨型对象的分区。 3. **标记-清除和复制移动**:G1会遍历所有对象,标记引用情况,清除对象后对区域进行复制移动,以整合碎片空间。 **年轻代回收**: - 采用复制算法进行并行收集,会触发Stop-The-World(STW)。 **老年代回收**: - 会与年轻代一起回收。 **回收过程**: 1. **初始标记**:完成堆root对象的标记,会触发STW。 2. **并发标记**:GC线程和应用线程并发执行。 3. **最终标记**:完成三色标记周期,会触发STW。 4. **复制/清除**:优先对可回收空间较大的区域进行回收。 ### ZGC算法 ZGC(Z Garbage Collector)是一种高效的垃圾回收算法,专为大堆内存设计,能够处理TB级别的堆,目标是将回收停顿时间控制在10ms以下。其主要特点如下: 1. **着色指针**:利用指针的高位比特位记录对象状态信息。 2. **读屏障**:用于支持并发标记和重定位。 3. **并发处理**:GC线程和应用线程并发执行垃圾回收任务。 4. **基于region**:类似G1,将堆划分为多个region。 5. **内存压缩**:对内存进行整理以减少碎片。 **回收过程**: 1. **roots标记**:标记root对象,会触发STW。 2. **并发标记**:利用读屏障与应用线程一起运行标记,可能会触发STW。 3. **清除**:清理标记为不可用的对象。 4. **roots重定位**:对存活的对象进行移动,以腾出大块内存空间,减少碎片产生。重定位最开始会触发STW,但时间取决于重定位集与对象总活动集的比例。并发重定位与并发标记类似。 这些算法在不同的场景下都有各自的优势和适用性,现代垃圾回收器会综合运用这些技术以达到最佳的性能和效率。 编辑于 2023-05-05 11:54 •IP属地 北京举报评论收藏
纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路。小洋垃圾回收算法一般有四种  ### 标记-清除算法(一般用于老年代) 就是对要回收的对象进行标记,标记完成后统一回收。(CMS垃圾收集器使用这种) **缺点**: #### 效率不稳定 执行效率不稳定,有大量对象时,并且有大量对象需要回收时,执行效率会降低。 #### 内存碎片化 内存碎片化,会产生大量不连续的内存碎片。(内存碎片只能通过使用分区空闲分配链表来分配内存) ### 标记-复制算法(一般用于新生代) 就是将内存分为两块,每次只用其中一块,垃圾回收时将存活对象,拷贝到另一块内存。(serial new,parallel new和parallel scanvage垃圾收集器) **缺点**: #### 不适合存活率高的老年代 存活率较高时需要很多复制操作,效率会降低,所以老年代一般不使用这种算法。 #### 浪费内存 会浪费一半的内存, 解决方案是新生代的内存配比是Eden:From Survivor: To Survivor = 8比1比1 每次使用时,Eden用来分配新的对象,From Survivor存放上次垃圾回收后存活的对象,只使用Eden和From Survivor的空间,To Survivor是空的,垃圾回收时将存活对象拷贝到To Survivor,当空间不够时,从老年代进行分配担保。 ### 标记-整理算法(一般用于老年代) 标记-整理算法跟标记-清除算法适用的场景是一样的,都是用于老年代,也就是存活对象比较多的情况。标记-整理算法的流程就是让存活对象往内存空间一端移动,然后直接清理掉边界以外的内存。(parallel Old和Serial old收集器就是采用该算法进行回收的) #### 吞吐量高 移动时内存操作会比较复杂,需要移动存活对象并且更新所有对象的引用,会是一种比较重的操作,但是如果不移动的话,会有内存碎片,内存分配时效率会变低,所以由于内存分配的频率会比垃圾回收的频率高很多,所以从吞吐量方面看,标记-整理法高于标记-清除法。 #### 延迟高 但是由于需要移动对象,停顿时间会比较长,垃圾回收时延迟会高一些,强调低延迟的CMS收集器一般是大部分时候用标记-清除算法,当内存碎片化程度达到一定程度时,触发Full GC,会使用标记-整理算法清理一次。 ### 分代收集算法 弱分代假说:就是绝大部分对象都是朝生夕灭。 强分代假说:熬过越多次垃圾收集的对象就越难以消忙。 就是现在的系统一般都比较复杂,堆中的对象也会比较多,如果使用对所有对象都分析是否需要回收,那么效率会比较低,所以有了分代收集算法,就是对熬过垃圾回收次数不同的对象进行分类,分为新生代和老年代,采用不同回收策略。 新生代存活率低,使用标记-复制算法。新生代发生的垃圾收集交Minor GC,发生频率较高 老年代存活率高,使用标记-清除算法,或者标记-整理算法。(CMS垃圾收集器一般是多数时间采用标记-清除算法,内存碎片化程度较高时,使用标记-整理算法收集一次)。老年代内存满时会触发Major GC(Full GC),一般触发的频率比较低。发布于 2022-02-23 11:09 •IP属地 安徽举报评论收藏
公众号进入网站体验更佳

