首页 > 试题广场 >

说说JVM的垃圾回收算法

[问答题]
1.引用计数法,每次赋值时均要维护引用计数器且计数器本身也有一定的消耗,较难处理循环引用,一般不采用这种方式; 2.复制算法,将内存分为两块,每次只使用其中一块,当这块内存用完,就将还活着的对象复制到另外一块上面,效率高且没有碎片,但是需要双倍的空间,年轻代中使用复制算法; 3.标记-清除,先标记要清除的对象,然后统一回收这些对象,不需要额外的空间,但是需要两次扫描耗时严重并且会产生内存碎片; 4.标记-整理,标记存活对象,然后将标记的存活对象按内存地址依次排序,清除边界外未标记的对象,没有内存碎片,但是需要移动对象。老年代一般用标记-清除和标记-整理的混合实现。
发表于 2022-05-06 23:01:15 回复(1)
分代算法 新生代:标记复制 老年代:标记整理
发表于 2022-05-03 15:35:01 回复(1)
垃圾回收算法有三种,一般常用的有两种。 标记清除:先标记,后清理,这样会产生大量的内存碎片,存储大对象的时候,可能会提前触发FULLGC。 复制:将堆内存分为两块,一块使用,一块用来放置将来存活的对象,这样会造成空间浪费,后来改进,因为对象都是朝圣夕死的,将堆内存分为三块,Eden,s1,s2,这样来使用,每次空闲的内存只需要一小块。大多在新生代中使用。 标记整理:标记存活的对象,然后让它们向内存的一端聚集,然后清除边界的未被标记的对象,一般在老年代使用。
发表于 2022-05-08 15:16:36 回复(0)
1.标记清除算法:优点:垃圾回收速度快。缺点:存在内存碎片。2.标记复制算法:优点:内存开销大。缺点:没有内存碎片。3.标记整理算法:优点:没有内存碎片。缺点:整理速度慢。
发表于 2022-06-01 11:16:31 回复(0)
标记清除:内部碎片问题; 标记复制:解决内部碎片问题,但内存开销大; 标记整理:stop the world整理速度慢;
发表于 2022-06-18 19:37:19 回复(0)
标记清除算法:通过可达性算法对于没有引用的对象进行标记,然后再对统一标记的对象进行回收/清除。优点:实现简单。缺点:1、在使用gc去清理对象过后,对于存活的对象可能会出现在空间不连续的位置,会导致出现内存碎片,如果下次还有存活的对象在找不到合适大小的位置的话,会再次触发gc去清理对象找到合适的位置,消耗了性能。2、如果堆中含有大量的对象需要被回收,那么会进行大量的标记和清除过程,造成了性能的消耗。 标记复制算法(改进后用于新生代):将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。优点:实现简单,效率高,解决了内存碎片问题。缺点:1、将可用内存缩小一半,空间浪费太多。2、对象存活太多的话,复制次数会增加,降低了效率。 标记整理算法(用于老年代):也通过可达性算法对于没有引用的对象进行标记,但是对存活的对象是向一端移动,然后直接清理掉一端以外所有的对象。缺点:老年代中存活对象比较多,移动这些存活的对象既影响性能又需要全部暂停用户程序才能进行,但是权衡利弊没有采用标记清除算法。
编辑于 2023-04-05 22:17:24 回复(0)
还有一题是让你说说JVM的垃圾回收机制,有点难区分
发表于 2022-09-21 15:37:40 回复(0)
新生代:复制算法 老年代:标记-清除,标记-整理
发表于 2022-09-17 09:25:17 回复(0)
1.标记清除算法:标记清除算法就是分为“标记”和“清除”两个阶段。标记出所有需要回收的对象,标记结束后统一回收。这个套路很简单,也存在不足,后续的算法都是根据这个基础来加以改进的 2.复制算法:为了解决效率问题,复制算法就出现了。它将可用内存按容量划分成两等分,每次只使用其中的一块。和survivor一样也是用from和to两个指针这样的玩法。fromPlace存满了,就把存活的对象copy到另一块toPlace上,然后交换指针的内容。这样就解决了碎片的问题。 这个算法的代价就是把内存缩水了,这样堆内存的使用效率就会变得十分低下了 3.标记整理算法:复制算法在对象存活率高的时候会有一定的效率问题,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存 4.分代收集算法:根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法
编辑于 2022-05-11 21:20:06 回复(0)
标记清除:算法简单、 但会产生大量的内存碎片 标记复制:内存利用率提高,避免产生大量的内存碎片 但使内存空间缩小一半 标记整理:利用率提高,但增加了移动的成本 分代收集算法:老年代使用标记清除+标记整理 新生代 标记复制
发表于 2024-03-16 14:49:59 回复(0)
编辑于 2024-03-08 11:21:35 回复(0)
引用计数法 每次赋值时均要维护引用计数器且计数器也有损耗、 标记整理 标记存活对象 清除为标记的 标记清除 标记要清楚的对象 然后统一回收对象 复制算法 新生代常用 把内存分为2块 每次只用其中一块
编辑于 2024-03-05 20:07:03 回复(0)
标记清楚-先标记要,然后统一回收,效率不高,会产生大量不连续的内存碎片 标记整理-标记完成不会直接清楚,而是让所有存活对象向一端移动,移动过程中清理掉可回收的对象,不会产生大量不连续的内存碎片 复制算法-将可用内存分为两块,每次使用其中一块,这块内存用完将存活对象复制到另一块,然后把使用过的内存空间清理 分代收集-根据对象存活周期划分老年代,新生代,永久代,不同生命周期对象采用不同回收算法
发表于 2023-08-16 10:29:43 回复(0)
(1)标记清除算法: 算法思路:算法分为“标记”和“清理”两个步骤,首先标记处所有需要回收的对象,在标记完成后再统一回收所有被标记的对象。 缺陷: 1.标记和清理的两个过程效率都不高; 2.容易产生内存碎片,碎片空间太多可能导致无法存放大对象。 适用于存活对象占多数的情况。 (2)标记整理算法 算法思路:标记过程和标记-清理算法一样,而后面的不一样,它是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存 (3)标记复制算法 算法思路:将可用内存划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完后,就将还存活的对象复制到另一块去,然后再把已使用过的内存空间一次清理掉。 缺陷: 可用内存缩小为了原来的一半 算法执行效率高,适用于存活对象占少数的情况。
发表于 2023-08-01 14:32:17 回复(0)
标记-清除 标记-复制 标记-整理。 ①方法1将标记为垃圾的对象直接回收,会产生内存碎片,但是简单 ②方法2将内存区域分为两部分,一部分是空的,将另一部分中被标记为不是垃圾的对象复制到空的那部分,然后对非空部分进行清除。不会产生内存碎片,缺点是可使用内存只有一半。新生代一般采用这种方法 ③将标记为非垃圾的对象移动到内存的一端,将这块内存边缘之外的所有空间进行清除。
编辑于 2023-07-21 13:19:12 回复(1)
标记清除、标记复制、标记整理;新生代垃圾回收机制使用 标记复制;老年代垃圾回收使用标记整理
发表于 2023-03-28 11:10:45 回复(0)
JVM的垃圾回收算法有三种: 1.标记-清除:这是最早出现的垃圾回收算法,它的主要流程是,首先标记所有可达的对象即存活的对象,之后清除所有不可达的对象内存,优点:高效,仅仅只是标记清除。 缺点:会产生碎片化的内存,如果java堆中的内存碎片化验证,则可能会导致Full GC. 2.标记-复制:标记所有不可达的对象,所有可达对象复制到另一块未被使用的空白内存中。之后清除这个需要GC的内存, 优点:不会产生碎片化空间, 缺点:由于需要使用一块备份的内存空间,所以在最坏的情况下,需要在堆中预留50%的内存区域,对内存的使用效率不高。 其中对于某些采用分代逻辑的虚拟机而言,这是回收新生代的垃圾回收算法,新生代中的各个区域默认为 eden:from serviour:to serviour = 8:1:1 其中垃圾回收的逻辑是 新生代对象都在eden区分配,每次垃圾回收会回收 eden + 其中一个serviour, 将这里面存活的对象移动到 另一个serviour。在新生代中其实只占用了 10% 的空间, 这是由于分代模型都是基于三种假说的。 1.大部分对象都是朝生夕灭的。 2.某些对象经历过的GC越多越难死。 3. 跨代引用的情况是非常少见的。 这三种假说促成了分代模型。 3.标记-整理:标记所有不可达对象,将所有可达对象移动到一起,整理成一个规整的空间,再将不可达对象清除。 这是老年代用到的垃圾搜集算法, 优点:空间很规整,不需要额外的备份空间。 缺点: GC时间很慢的,浪费时间。 说一下这三种算法的应用场景。 1. 标记-清除算法在我记忆中只有 CMS 收集器再使用,这个算法天生就有bug,碎片化问题会导致Full GC,这个是致命的问题。 2.标记-复制算法:这个算法使用的非常广泛,在所有分代模型的虚拟机中,对新生代的垃圾回收都是使用该算法,并且由于前面的三种假说, 导致了在新生代中使用这个算法并不需要 50%的备份空间,仅仅最需要 10%的空间就足够。在之后的一个非物理分代的模型中,也是使用的这个算法。如 G1,ZGC,Shenandoah 收集器。 在这些收集器中,他们摒弃了分代模型,从而使用一种自定义的空间块 Region 区域,每一次的回收仅仅将,一块Region中的存活对象移动到另一块没有被使用的Region区域中。 由于这个特性,所以三个收集器在GC的过程中,不可能和之前的一样,等着不能分配对象空间的时候再去GC,而是当内存使用率达到一个阈值的时候去GC。 3.标记-整理:这个算法主要被使用在一些采用分代模型的老年代内存中,由于三种假说的成立,老年代的对象应该是很难死的,所以这个区域的垃圾收集不太可能以很快的频率去做。 在采用分代模型中的GC行为,一般都是以高频率去回收新生代,以低频率去回收老年代空间。
编辑于 2023-03-17 18:25:48 回复(0)
JVM垃圾回收算法分为三种:标记清除、标记复制、标记整理。标记清除:两个阶段,第一阶段将那些没有被引用的对象进行标记,第二阶段将这些标记的对象进行回收,缺点是会造成一段不连续的内存碎片,如果需要创建占用很大内存的对象,就会造成内存浪费。标记复制:分配两块内存一样大小的内存,每次只用其中一块,将存活的的对象进行标记,复制到另一块内存中,再将这个内存中的对象进行回收,缺点是:如果存活对象占大部分,复制对象会带来很大的性能开销。标记整理:将未被引用的对象进行标记,将没有被标记的存活对象移动到内存的另一端,并将边界以外的内存清除掉。垃圾收集器一般采用,标记复制和标记整理两者混合使用。新生代采用标记复制算法,老年代采用标记整理算法,新生代内存分为三个区间,Eden区和两个survior区,占用内存比例是8:1:1,即每次新生代的内存可用空间为90%。,发生垃圾搜集时,会将Eden空间和其中一块的surviror空间的存活对象复制到另一块surviror内存空间,然后直接清理掉Eden和已用过的那块survivor空间。
发表于 2023-03-14 10:41:24 回复(0)
collection有set,list,queue三个子接口 map
编辑于 2023-03-10 13:52:39 回复(0)
引用技术和可达性分析判断对象是否存活 Java用可达性分析 标记复制(新生代使用): 将存货对象复制到一块新的内存 清除掉其他内存 好处是没有内存碎片 但是需要额外的内存 一般新生代内存不够还会借用老年代内存 标记清除|标记整理 (老年代使用):先标记要清除的对象 然后全部删除 会有内存碎片 | 先将存活对象整理到一边 清除掉其它的 与复制类似 没有内存碎片
发表于 2023-03-05 15:55:41 回复(0)