首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
说说JVM的垃圾回收算法。
[问答题]
说说JVM的垃圾回收算法。
查看答案及解析
添加笔记
求解答(0)
邀请回答
收藏(207)
分享
纠错
68个回答
添加回答
47
牛客540183237号
1.引用计数法,每次赋值时均要维护引用计数器且计数器本身也有一定的消耗,较难处理循环引用,一般不采用这种方式; 2.复制算法,将内存分为两块,每次只使用其中一块,当这块内存用完,就将还活着的对象复制到另外一块上面,效率高且没有碎片,但是需要双倍的空间,年轻代中使用复制算法; 3.标记-清除,先标记要清除的对象,然后统一回收这些对象,不需要额外的空间,但是需要两次扫描耗时严重并且会产生内存碎片; 4.标记-整理,标记存活对象,然后将标记的存活对象按内存地址依次排序,清除边界外未标记的对象,没有内存碎片,但是需要移动对象。老年代一般用标记-清除和标记-整理的混合实现。
发表于 2022-05-06 23:01:15
回复(3)
12
阐禅
垃圾回收算法有三种,一般常用的有两种。 标记清除:先标记,后清理,这样会产生大量的内存碎片,存储大对象的时候,可能会提前触发FULLGC。 复制:将堆内存分为两块,一块使用,一块用来放置将来存活的对象,这样会造成空间浪费,后来改进,因为对象都是朝圣夕死的,将堆内存分为三块,Eden,s1,s2,这样来使用,每次空闲的内存只需要一小块。大多在新生代中使用。 标记整理:标记存活的对象,然后让它们向内存的一端聚集,然后清除边界的未被标记的对象,一般在老年代使用。
发表于 2022-05-08 15:16:36
回复(0)
10
overdose201907212346852
分代算法 新生代:标记复制 老年代:标记整理
发表于 2022-05-03 15:35:01
回复(1)
8
牛客793464225号
1.标记清除算法:优点:垃圾回收速度快。缺点:存在内存碎片。2.标记复制算法:优点:内存开销大。缺点:没有内存碎片。3.标记整理算法:优点:没有内存碎片。缺点:整理速度慢。
发表于 2022-06-01 11:16:31
回复(0)
3
岑溪123
标记清除算法:通过可达性算法对于没有引用的对象进行标记,然后再对统一标记的对象进行回收/清除。优点:实现简单。缺点:1、在使用gc去清理对象过后,对于存活的对象可能会出现在空间不连续的位置,会导致出现内存碎片,如果下次还有存活的对象在找不到合适大小的位置的话,会再次触发gc去清理对象找到合适的位置,消耗了性能。2、如果堆中含有大量的对象需要被回收,那么会进行大量的标记和清除过程,造成了性能的消耗。 标记复制算法(改进后用于新生代):将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。优点:实现简单,效率高,解决了内存碎片问题。缺点:1、将可用内存缩小一半,空间浪费太多。2、对象存活太多的话,复制次数会增加,降低了效率。 标记整理算法(用于老年代):也通过可达性算法对于没有引用的对象进行标记,但是对存活的对象是向一端移动,然后直接清理掉一端以外所有的对象。缺点:老年代中存活对象比较多,移动这些存活的对象既影响性能又需要全部暂停用户程序才能进行,但是权衡利弊没有采用标记清除算法。
编辑于 2023-04-05 22:17:24
回复(0)
3
牛客_正
标记清除:内部碎片问题; 标记复制:解决内部碎片问题,但内存开销大; 标记整理:stop the world整理速度慢;
发表于 2022-06-18 19:37:19
回复(0)
2
安静的我面试中
常用的有4种算法: (1)标记-清除算法:分标记和清楚两个阶段,实现简单,但会导致内存碎片化,可能引发Full GC,适用于老年代CMS垃圾回收器; (2)复制算法:将堆分为两类,存活对象复制到另一块区域后清空原区域,没有碎片化问题,效率高,但存在空间利用率低的问题,适用于年轻代(Serial/Parallel); (3)标记-整理算法:标记后将整理存活的对象至另外一端,清理边界外空间,避免了碎片问题,内存利用率高,但整理耗时,可能会导致STW,适用于老年代(Serial Old); (4)分代收集算法:按对象生命周期划分为新生代(复制算法)和老年代(标记-清除/整理),针对性的算法优化了效率,但需要协调多代策略,通用方案是G1/Parallel GC。
发表于 2025-05-20 18:12:33
回复(0)
2
牛客731461654号
1.标记清除算法:标记清除算法就是分为“标记”和“清除”两个阶段。标记出所有需要回收的对象,标记结束后统一回收。这个套路很简单,也存在不足,后续的算法都是根据这个基础来加以改进的 2.复制算法:为了解决效率问题,复制算法就出现了。它将可用内存按容量划分成两等分,每次只使用其中的一块。和survivor一样也是用from和to两个指针这样的玩法。fromPlace存满了,就把存活的对象copy到另一块toPlace上,然后交换指针的内容。这样就解决了碎片的问题。 这个算法的代价就是把内存缩水了,这样堆内存的使用效率就会变得十分低下了 3.标记整理算法:复制算法在对象存活率高的时候会有一定的效率问题,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存 4.分代收集算法:根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法
编辑于 2022-05-11 21:20:06
回复(0)
1
徐涛1
还有一题是让你说说JVM的垃圾回收机制,有点难区分
发表于 2022-09-21 15:37:40
回复(0)
1
在攒经验的菠萝蜜很积极
新生代:复制算法 老年代:标记-清除,标记-整理
发表于 2022-09-17 09:25:17
回复(1)
0
在炒股的啤酒肚很爱吃香菜
标记清除:效率快,会产生碎片 复制:效率快,不产生碎片,占用空间 标记整理:效率慢,不产生碎片
发表于 2025-12-18 15:24:16
回复(0)
0
石皮流水
JVM 的垃圾回收(GC)算法是内存管理的核心,其目标是识别并回收不再被使用的对象内存,避免内存泄漏,同时平衡回收效率、内存利用率和停顿时间。 JVM主要垃圾回收(GC)算法包括:标记-清除(产生内存碎片)、复制算法(适合新生代)、标记-整理(适合老年代)。现代JVM多采用分代收集策略,结合不同算法管理新生代(复制)和老年代(标记-清除/整理)。还有增量、并发算法(如G1)减少停顿时间。
发表于 2025-12-15 16:53:48
回复(0)
0
rlllloot
垃圾回收算法主要包括:复制算法,标记清除,标记整理
发表于 2025-12-09 19:11:12
回复(0)
0
夜斗小神社
标记-清除算法、复制算法、标记-整理算法 分代算法。。
发表于 2025-10-20 15:09:14
回复(0)
0
奔放的小猫不愿再收感谢信
1.标记清除法。首先通过可达性分析算法找到内存中的存活对象并标记,然后对未被标记的对象进行清除。优点是不需要额外的空间,缺点是需要扫描两次,耗时且效率低,而且会产生内存碎片。 2.复制算法。将内存分为大小相等的两块,使用其中一块,在需要进行垃圾回收时,将存活对象复制到另一块内存中,然后一次性清除当前内存中的所有对象。优点是不会产生内存碎片,效率更高,缺点是空间利用率低,总是有一半的内存空间是闲置的。 3.标记-整理法。首先标记内存中的存活对象,然后将存活对象统一向一侧移动,然后清除边界以外的所有对象。优点是不会产生内存碎片,缺点是移动对象需要时间,效率低。
发表于 2025-10-19 21:32:20
回复(0)
0
Rsya
标记-整理法,标记-清除法,
发表于 2025-10-09 15:27:31
回复(0)
0
梦到啥说啥
1. 复制:牺牲内存
2. 清除:内存碎片
3. 整理
在少量数据下复制块,大量数据下整理块
发表于 2025-09-24 21:31:26
回复(0)
0
想回老家的磨洋工匠人在debug
标记-清除,标记-整理常用于老年代,复制算法适用于新生代,分代收集算法适合所有现代的JVM收集器; 标记-清除核心操作:标记存活-清除废弃,会产生内存碎片;标记-整理核心操作:标记对象-向一端移动,不会产生内存碎片,但是效率较低因为要移动对象;复制算法核心操作:标记存活-复制到新区,内存利用率低
发表于 2025-09-22 20:12:28
回复(0)
0
牛客548706960号
标记复制(两块一样的内存)、
标记清除(快、但是内存碎片造成fullgc)、标记整理(效率低、stw久)。 一般eden区用标记复制(死的快)、old用标记清除(死得慢)
发表于 2025-09-15 22:32:56
回复(0)
0
神序01
标记清除:先标记使用过的内存再清理,这样效率高但会产生大量内存碎片,标记整理:先标记内存再将它们整理在一块集中在一块区域清除,不会产生内存碎片但效率低,复制:将内存复制下来会占用大量内存,在复制大对象时效率低,CMS,G1
发表于 2025-09-05 14:09:39
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
Java
来自:
2025年-华为-通用...
上传者:
real1993
难度:
68条回答
207收藏
3686浏览
热门推荐
相关试题
说说你对AOP的理解。
Spring
评论
(168)
来自
2025年-华为-通用软...
ThreadLocal 的用法和实...
Java
评论
(77)
来自
2025年-华为-通用软...
请你说说==与equals()的区别
Java
评论
(246)
来自
2025年-华为-通用软...
如何创建线程池?线程池常见参数有哪些?
Java
评论
(86)
来自
2025年-华为-通用软...
JDK动态代理是什么?和cglib区别?
评论
(10)
来自
2025年-华为-通用软...
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题