首页 > 试题广场 >

说说JVM的垃圾回收算法。

[问答题]
说说JVM的垃圾回收算法。
1.引用计数法,每次赋值时均要维护引用计数器且计数器本身也有一定的消耗,较难处理循环引用,一般不采用这种方式; 2.复制算法,将内存分为两块,每次只使用其中一块,当这块内存用完,就将还活着的对象复制到另外一块上面,效率高且没有碎片,但是需要双倍的空间,年轻代中使用复制算法; 3.标记-清除,先标记要清除的对象,然后统一回收这些对象,不需要额外的空间,但是需要两次扫描耗时严重并且会产生内存碎片; 4.标记-整理,标记存活对象,然后将标记的存活对象按内存地址依次排序,清除边界外未标记的对象,没有内存碎片,但是需要移动对象。老年代一般用标记-清除和标记-整理的混合实现。
发表于 2022-05-06 23:01:15 回复(4)
垃圾回收算法有三种,一般常用的有两种。 标记清除:先标记,后清理,这样会产生大量的内存碎片,存储大对象的时候,可能会提前触发FULLGC。 复制:将堆内存分为两块,一块使用,一块用来放置将来存活的对象,这样会造成空间浪费,后来改进,因为对象都是朝圣夕死的,将堆内存分为三块,Eden,s1,s2,这样来使用,每次空闲的内存只需要一小块。大多在新生代中使用。 标记整理:标记存活的对象,然后让它们向内存的一端聚集,然后清除边界的未被标记的对象,一般在老年代使用。
发表于 2022-05-08 15:16:36 回复(1)
分代算法 新生代:标记复制 老年代:标记整理
发表于 2022-05-03 15:35:01 回复(1)
1.标记清除算法:优点:垃圾回收速度快。缺点:存在内存碎片。2.标记复制算法:优点:内存开销大。缺点:没有内存碎片。3.标记整理算法:优点:没有内存碎片。缺点:整理速度慢。
发表于 2022-06-01 11:16:31 回复(1)
常用的有4种算法: (1)标记-清除算法:分标记和清楚两个阶段,实现简单,但会导致内存碎片化,可能引发Full GC,适用于老年代CMS垃圾回收器; (2)复制算法:将堆分为两类,存活对象复制到另一块区域后清空原区域,没有碎片化问题,效率高,但存在空间利用率低的问题,适用于年轻代(Serial/Parallel); (3)标记-整理算法:标记后将整理存活的对象至另外一端,清理边界外空间,避免了碎片问题,内存利用率高,但整理耗时,可能会导致STW,适用于老年代(Serial Old); (4)分代收集算法:按对象生命周期划分为新生代(复制算法)和老年代(标记-清除/整理),针对性的算法优化了效率,但需要协调多代策略,通用方案是G1/Parallel GC。
发表于 2025-05-20 18:12:33 回复(0)
标记清除算法:通过可达性算法对于没有引用的对象进行标记,然后再对统一标记的对象进行回收/清除。优点:实现简单。缺点:1、在使用gc去清理对象过后,对于存活的对象可能会出现在空间不连续的位置,会导致出现内存碎片,如果下次还有存活的对象在找不到合适大小的位置的话,会再次触发gc去清理对象找到合适的位置,消耗了性能。2、如果堆中含有大量的对象需要被回收,那么会进行大量的标记和清除过程,造成了性能的消耗。 标记复制算法(改进后用于新生代):将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。优点:实现简单,效率高,解决了内存碎片问题。缺点:1、将可用内存缩小一半,空间浪费太多。2、对象存活太多的话,复制次数会增加,降低了效率。 标记整理算法(用于老年代):也通过可达性算法对于没有引用的对象进行标记,但是对存活的对象是向一端移动,然后直接清理掉一端以外所有的对象。缺点:老年代中存活对象比较多,移动这些存活的对象既影响性能又需要全部暂停用户程序才能进行,但是权衡利弊没有采用标记清除算法。
编辑于 2023-04-05 22:17:24 回复(0)
标记清除:内部碎片问题; 标记复制:解决内部碎片问题,但内存开销大; 标记整理:stop the world整理速度慢;
发表于 2022-06-18 19:37:19 回复(0)
1.标记清除算法:标记清除算法就是分为“标记”和“清除”两个阶段。标记出所有需要回收的对象,标记结束后统一回收。这个套路很简单,也存在不足,后续的算法都是根据这个基础来加以改进的 2.复制算法:为了解决效率问题,复制算法就出现了。它将可用内存按容量划分成两等分,每次只使用其中的一块。和survivor一样也是用from和to两个指针这样的玩法。fromPlace存满了,就把存活的对象copy到另一块toPlace上,然后交换指针的内容。这样就解决了碎片的问题。 这个算法的代价就是把内存缩水了,这样堆内存的使用效率就会变得十分低下了 3.标记整理算法:复制算法在对象存活率高的时候会有一定的效率问题,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存 4.分代收集算法:根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法
编辑于 2022-05-11 21:20:06 回复(0)
还有一题是让你说说JVM的垃圾回收机制,有点难区分
发表于 2022-09-21 15:37:40 回复(0)
新生代:复制算法 老年代:标记-清除,标记-整理
发表于 2022-09-17 09:25:17 回复(1)
垃圾回收算法主要有标记-清除、标记-整理和复制算法,
发表于 2026-04-21 15:14:07 回复(0)
1.标记-清除;2.复制;3.标记-整理;4.分代收集
发表于 2026-04-17 22:26:26 回复(0)
1.标记清除;从 GC Roots 开始标记所有可达对象,遍历堆,回收未被标记的对象。优点:实现简单;缺点;两次遍历效率低,产生内存碎片。 2.标记复制:应用于新生代回收。将内存分为大小相等的两块,每次只使用其中一块,回收时将存活对象复制到另一块。优点:没有空间碎片,缺点:内存利用率低 3.标记整理:应用于老年代回收。标记所有存活对象,将所有存活对象向一边移动,清理边界外的空间。优点;无内存碎片;缺点:开销大
发表于 2026-03-23 16:21:52 回复(0)
JVM常见回收算法主要有标记-清除、标记-整理、复制、以及基于对象生命周期特点的分代收集思想 在真正回收前,JVM一般先通过可达性分析法判断对象是否还存活(root:栈帧引用的本地变量、方法区的静态变量、常量、JNI引用的变量),而不是使用引用计数(循环引用无法解决) 标记-清除算法分为标记和清除两个阶段,实现简单,但产生内存碎片 复制是把内存空间分成两片,每次只使用一块,回收时把存活的对象复制到另一边,再一次性清空原空间,没有内存碎片但内存利用率低,适合存活对象少的新生代 标记整理在标记之后把存活对象向一端移动,再清理边界外的空间,解决碎片问题,但移动对象成本高,适合老年代 JVM实际上使用分代收集思想:新生代对象朝生夕死,通常采用复制,老年代存活率高,一般采用标记清除或者标记整理。不同垃圾回收会在这些算法之上做不同实现
发表于 2026-03-23 11:45:32 回复(0)
JVM 的垃圾回收主要分两部分:一是判断对象是否存活,二是选择合适的回收算法。 判断对象是否存活,主流采用的是可达性分析,而不是引用计数,因为引用计数解决不了循环引用问题。 常见垃圾回收算法主要有四种: 第一是标记-清除,先标记再清除,优点是实现简单,缺点是会产生内存碎片; 第二是复制算法,把存活对象复制到另一块内存,适合存活率低的区域,比如新生代; 第三是标记-整理,先标记,再把存活对象向一端压缩,适合老年代; 第四是分代收集,本质上是根据新生代和老年代对象存活率不同,组合使用不同算法。 所以实际 JVM 中,新生代一般采用复制算法,老年代一般采用标记清除或标记整理。
发表于 2026-03-20 22:04:40 回复(0)
JVM 常见的垃圾回收算法主要包括标记-清除、复制算法和标记-整理算法。标记-清除算法先标记存活对象,再清除未标记对象,优点是简单但会产生内存碎片;复制算法将存活对象从一个区域复制到另一个区域,效率高但需要额外空间,常用于新生代;标记-整理算法在标记后将存活对象向一端移动,避免了内存碎片,适用于老年代。 在实际 JVM 中,这些算法通常会结合使用,例如新生代采用复制算法,老年代采用标记-整理或标记-清除算法。
发表于 2026-03-20 17:40:43 回复(0)
标记清除算法,容易产生内存碎片;标记复制算法,不容易产生内存碎片,但可用内存变成原来的一半;标记整理算法,没有内存碎片,但需要整理,效率不高。分代收集算法:新生代回收频率高并且存活对象少,适合用标记复制算法。老年代存活率高,复制消耗大,因此采用标记整理算法
发表于 2026-03-12 20:38:33 回复(0)
jvm的垃圾回收是为了自动回收堆中无用对象,释放内存的机制。通过可达性分析,以GCroot为根结点判断对象是否存活,然后采用分代回收思想,新生代对象存活时间短,使用标记-复制算法,老年代对象存活时间长,采用标记-整理或者标记-删除算法。
发表于 2026-03-12 16:19:19 回复(0)
标记清理:标记存活的,是垃圾就清理,标记整理:整理存活的放在堆顶,清理垃圾,标记复制:新创建的在eden,然后再survivor,然后就是老年代
发表于 2026-03-10 08:44:53 回复(0)
有三种,标记清除,标记复制,标记整理,标记是通过三色染色法,白色表示没有引用指向,灰色表示有引用指向但还没处理完,黑色表示有引用指向且处理完成,清除是删除所有被标记的对象,复制是维护一个复制区,将不需要清除的对象复制到复制区后清除原来区域所有对象,整理就是清除完后往内存一端移动避免内存随便问题
发表于 2026-03-05 20:13:13 回复(0)