JavaScript面试题:关于js垃圾回收机制

关于js垃圾回收机制

定义

在 JavaScript 中,垃圾回收机制是由内置的垃圾回收器(Garbage Collector,简称 GC)来实现的。

JavaScript 垃圾回收机制的主要工作是监测对象的引用以及对不再被使用的对象进行自动的内存回收。

JavaScript 的垃圾回收器主要采用的是标记清除(Mark and Sweep)算法引用计数(Reference Counting)算法结合的方式,其中标记清除算法用于标记并清除整个对象图中的无用对象,而引用计数算法用于回收循环引用的对象

有哪些垃圾回收算法?

标记清除算法:(mark and sweep)

标记清除算法一般分为两个阶段:标记阶段和清除阶段。在标记阶段,垃圾回收器会对程序中的对象进行遍历,并对所有能够直接或间接访问到的对象进行标记,将它们标记为“活动对象”,而未被标记的对象则被认为是“垃圾对象”。在接下来的清除阶段,垃圾回收器会将所有被认为“垃圾对象”的存储空间进行释放,以便可以重新利用这些空间。

缺点:一是当有大量的垃圾对象存活时,执行垃圾回收操作的时间会比较长,影响程序的性能;二是由于在这个过程中会产生不连续的内存碎片,导致在后续程序执行过程中分配大块的内存空间时出现问题

引用计数算法(reference counting),

引用计数的策略是跟踪记录每个值被使用的次数,每当一个对象被创建或被赋值给一个变量时,它的引用计数就会加 1;而当一个对象的引用被删除,或者一个函数执行完毕后,它的引用计数就会减 1。
当一个对象的引用计数减为 0 时,就可以将其所占用的内存空间回收,垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间

引用计数算法的优点是能够快速回收不再被使用的内存空间,因为垃圾对象可以在它变得不可访问时立即被释放。但是,引用计数算法也有缺陷,当存在对象之间的循环引用时,这些对象的引用计数永远不可能减为 0,导致它们所占用的内存空间无法被释放,从而出现了内存泄漏问题

在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。

分代收集算法

是指将内存中的对象按照其生命周期的不同阶段划分到不同的代中,一般分为新生代、老年代和永久代等。新生代中的对象生命周期较短,大多数对象在创建后很快就被回收了,而老年代中的对象则具有更长的生命周期。对于不同代中的对象,垃圾回收器会采用不同的收集算法和回收策略,以提高垃圾回收的效率和减少程序停顿时间。

复制算法

是指在垃圾回收时,将存活的对象从一个内存区域复制到另一个内存区域,同时标记和清除不再使用的对象。一般情况下,内存空间被划分为两个相等的区域,每次只使用其中一个区域,当这个区域满时,将其中的存活对象复制到另一个区域中,再将原区域中的对象全部清除。采用复制算法的垃圾回收器可以避免由于产生大量内存碎片而引发的内存分配失败问题

猜你喜欢

转载自blog.csdn.net/lalala_dxf/article/details/131276948