首页 > 试题广场 >

说一下浏览器垃圾回收机制?

[问答题]
有两种机制:1、标记清除:对所有活动对象进行标记,清除阶段会将没有标记的对象清除;标记整理算法:标记结束后,算法将活动对象压入内存一端,则需要清理的对象在边界,直接被清理掉就行。(效率低) 2、引用计数:将对象是否不再需要简化定义为有没有其他对象引用它,如果没有引用指向这个对象,则会被垃圾回收机制回收。(内存空间不连续)
发表于 2022-05-23 10:06:18 回复(0)
浏览器的垃圾回收机制就是我们程序在工作的过程中或者执行之后,会产生一些用不到的内存变量,这些变量会一直占据这内存,所以这时候需要垃圾回收机制帮我清理这些用不到的变量,从而释放内存空间。垃圾回收机制最常见的有两种:1.标记清除算法。2:引用计数算法。标记清除算法就是执行前将所有的变量打上标记,执行完成后未被打上标记的变量就会当做垃圾回收。浏览器会隔一段时间进行一次标记清除标记清除算法的缺点:被释放的掉的内存空间是不连续被,之前一直占据内存的变量隔开,导致内存空间不连续,会出现分配不一的问题。引用计数算法:就是对对象的引用次数进行增加或者减少,如果引用次数变为0,那么该对象分配的内存空间立即就会被清除掉。缺点就是会出现相互引用的情况。会导致对象一直被引用无法被清除
发表于 2022-08-04 10:19:04 回复(0)
引用计数:一个对象不被其他对象引用时会被回收 问题:循环引用时无法回收 标记-清除:从根元素开始,周期性标记可被访问的对象,同时回收不可被访问的对象 问题:收集垃圾时程序会等待,且回收后的内存空间不连续,于是出现了 标记-整理机制,即回收后会整理内存空间,但效率又会降低一些
发表于 2022-05-06 10:25:18 回复(0)
JS基本数据类型的变量存储在栈中,引用类型的变量存储的堆中。 存在栈中的变量随着执行上下文的销毁而销毁。 存在堆中的变量有两种清除机制: 1.引用计数:堆中的每个变量会有一个计数器,记录引用该变量的次数。一旦计数器为0,垃圾回收机制会将这部分内存回收。 2.标记清除:堆中的每个变量会一个标记,如果有任何引用则标记会被清除,垃圾回收机制会将没有标记的部分内存回收。
编辑于 2022-08-16 12:02:10 回复(0)
【概念】
浏览器垃圾回收机制根据数据的存储方式分为栈垃圾回收和堆垃圾回收。
- 栈垃圾回收的方式非常简便,当一个函数执行结束之后,JavaScript引擎会通过向下移动ESP(ESP为栈指针,用于指向栈的栈顶)来销毁函数保存栈中的执行上下文,遵循先进后出的原则。
- 堆垃圾回收,当函数直接结束,栈空间处理完成了,但是堆空间的数据虽然没人被引用,但是还是存储在堆空间中,需要垃圾回收器将堆空间的垃圾数据回收,为了使垃圾回收达到更好的效果,根据对象的生命周期不一样,使用不同的垃圾回收的算法。
- V8引擎对堆内存中的JS对象进行分代管理(新生代和老生代),新生代:存活周期较短的JS对象,如临时变量、字符串等;老生代:经过多次垃圾回收仍然存活,存活周期较长的对象,如主控制器、服务器对象等。(新生区中使用Scavenge算法,老生区使用标记-清除算法和标记-整理算法。)
- 常用垃圾回收算法有下面两种。引用计数(现代浏览器不再使用) | 标记清除(常用)
【引用计数】
- 定义:对于引用计数垃圾回收算法,把对象是否不再需要简化定义为该对象有没有其他变量或对象引用到它,如果没有引用指向该对象,该对象将被垃圾回收机制回收。在这里,对象的概念不仅特指JavaScript对象,还包括函数作用域或者全局词法作用域。引用计数垃圾回收算法使用比较少,主要是在IE6与IE7等低版本IE浏览器中使用。
- 限制:当对象循环引用时,就会造成内存泄漏,也就是引用计数垃圾回收算法无法处理循环引用的对象。
【标记清除】
- 定义:对于标记清除垃圾回收算法,把对象是否不再需要简化定义为该对象是否可以获得。垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象,以此不断向下查找。从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象,这样便解决了循环引用的问题。所有现代浏览器都使用了标记清除垃圾回收算法,所有对JavaScript垃圾回收算法的改进都是基于标记清除算法的改进。
编辑于 2023-01-06 15:12:22 回复(0)
我们将有些已经被使用过的,后面可能不会再进行使用的数据,称为垃圾数据,数据一直保存在内存中,占用的内存会越来越多,为了防止内存泄漏,程序会不定期的寻找不再使用的变量,并释放掉他们所占用的内存空间。垃圾回收机制主要通过“标记-清除”来进行变量回收,当变量进入环境时,会标记为“进入环境”。当变量离开环境时,会标记为“离开环境”,标记为“离开环境”的变量就会回收内存。
编辑于 2022-07-22 09:29:40 回复(0)
浏览器垃圾回收机制根据数据的存储方式分为栈垃圾回收和堆垃圾回收。栈垃圾回收的方式非常简便,当一个函数执行结束之后,JavaScript引擎会通过向下移动ESP来销毁函数保存栈中的执行上下文,遵循先进后出的原则。堆垃圾回收,当函数直接结束,栈空间处理完成了,但是堆空间的数据虽然没人被引用,但是还是存储在堆空间中,需要垃圾回收器将堆空间的垃圾数据回收,为了使垃圾回收达到更好的效果,根据对象的生命周期不一样,使用不同的垃圾回收的算法。在V8中会把堆分为新生代和老生代两个区域,新生代中存放的是生存时间短的对象,老生代中存放的是生存时间久的对象。新生区中使用Scavenge算法,老生区使用标记-清除算法和标记-整理算法。
发表于 2022-07-17 10:37:47 回复(0)
引用计数:当一个对象引用为0的时候,这个对象就会被回收; 标记清除:核心思路: 可达性,有一个根对象 从该对象出发 开始引用到所用到的对象 对于根对象没有引用到的对象 认为是不可用的对象,对于不可用的对象 则进行回收
发表于 2022-08-31 16:00:39 回复(0)
https://blog.csdn.net/yingmd2020/article/details/117928175 好详细
发表于 2022-05-26 10:58:10 回复(0)
浏览器定期回收一些不再使用的内存,避免内存泄漏。她是通过标记清除算法,进行垃圾回收的。具体过程为对引用对象进行标记,清除未被标记的对象,整理内存,防止内存碎片化。垃圾回收的对象是不可达对象与引用计数为0的,不可达对象是不再被引用的对象,引用计数是每个对象都有个计数器,计数器为0则被回收。回收的时机在于浏览器的内存达到某个阈值,或者事件循环空闲的时候。
发表于 2025-05-12 17:14:43 回复(0)
1.标记回收:对使用的部分作标记,最后清理未标记部分; 2.引用计数:看是否有引用,无关联引用部分则清理回收。
发表于 2025-02-18 15:16:07 回复(0)
有栈垃圾回收和堆垃圾回收,栈垃圾回收专门处理类似函数、局部变量的垃圾,堆垃圾回收主要处理动态创建内存、长时间后才回收的垃圾。 栈垃圾回收遵循先进后出的原则,在函数执行完以后进行回收 堆垃圾回收方法主要有: 1.新生代老生代回收:新生代主要是刚创建的,频繁进行回收的元素。老生代主要是在经历了很多次垃圾回收之后还存活下来的元素 2.标记清理法:在根节点,通过遍历,对每个能达到的元素进行标记,未被标记到的元素进行垃圾回收。 3.标记整理法:跟上述一样的方法进行标记,将被标记的元素推入储存的一段,另一端则直接被清除 4.引用计数法:计数每个元素被引用的次数,没被计数的元素则被清除
发表于 2024-10-30 20:55:31 回复(0)
浏览器的垃圾回收机制分为 **栈垃圾回收** 和 **堆垃圾回收**。 - **栈垃圾回收**:栈中的数据按先进后出的原则进行管理,当函数执行结束时,JavaScript 引擎通过移动指针 (ESP) 释放栈中保存的执行上下文,回收栈内存,操作简单且高效。 - **堆垃圾回收**:堆中的数据并不会像栈那样自动释放,垃圾回收器会定期扫描堆内存,将不再被引用的对象进行回收。V8 引擎将堆分为 **新生代** 和 **老生代**: - **新生代**:存放生命周期短的对象,采用 **Scavenge算法** 进行垃圾回收。 - **老生代**:存放生命周期较长的对象,使用 **标记-清除算法** 和 **标记-整理算法**。 **Scavenge算法**: 1. **标记**:将存活的对象标记。 2. **复制和整理**:存活对象被复制到空闲区域并有序排列,消除内存碎片。 3. **角色翻转**:复制后,原对象区域和空闲区域角色对调,实现空间的重复利用。 **标记-清除算法**: 1. **标记**:从根元素开始遍历,标记存活对象。 2. **清除**:删除未标记的垃圾数据。 3. **内存碎片**:多次执行会导致不连续的内存碎片,影响大对象的分配。 **标记-整理算法**: 1. **标记**:与标记-清除相同,标记存活对象。 2. **整理**:将存活对象向一端移动,减少内存碎片。 3. **清除**:清除未使用的内存。 V8 引擎的垃圾回收机制包括 **副垃圾回收器**(处理新生代)和 **主垃圾回收器**(处理老生代)。由于 JavaScript 在主线程执行,垃圾回收会导致 **全停顿**,即所有脚本暂停执行,等待回收完成。 为减少老生代垃圾回收引起的卡顿,V8 采用了 **增量标记** 算法,将标记过程拆分成多个小任务,交替执行垃圾回收和 JavaScript 逻辑,提升性能。
发表于 2024-10-12 17:26:34 回复(0)
浏览器的垃圾回收机制是自动管理和释放内存的机制,主要用于处理不在使用的变量和资源,以免造成内存泄漏,提高浏览器性能和响应能力。1.引用计数法:每一个对象都有一个应用计数器,当对象被引用是,计数器加1,当引用被移除时,计数器减1,当计数器为0时,则判定该对象不在被使用,可以回收; 2.标记清除法:从一组根元素开始,递归遍历这些元素,标记所有从根元素可到达的对象,未被标记的对象即为垃圾数据,随后被清除,这种方***产生内存碎片; 3.标记整理法:标记阶段后,将存活的对象压缩到内存的一边,整理出连续的内存空间,减少内存碎片。 及时回收不必要的内存,减少内存不足而引起页面卡顿和崩溃的风险,提升用户体验
编辑于 2024-12-10 15:42:18 回复(0)
栈垃圾回收、堆垃圾回收、新生区老生区、Scavenge算法、标记-清除算法、标记-整理算法、全停顿、增量标记
发表于 2024-09-03 22:03:39 回复(0)
标记清除法和引用计数法: 标记清除法:每个变量进入环境时都会被打上进入环境的标记,当变量离开环境时将标记清除,原则上有标记的参数不可能被清除,每隔一段时间将所有的变量都打上标记,没有被引用的变量标记会被清除,一段时间后垃圾收集器会清除未标记的变量。缺点:方法的空间是不连续的,空间分配不一 引用计数法:当一个变量被创建引用时,引用一次就将其参数标记为1,如果该变量被引用一次则标记+1,取消引用一次就-1,浏览器会将标记为0的变量清除 缺点:会出现相互引用的情况,导致一些变量总是不被回收
发表于 2024-04-29 17:20:31 回复(0)
1.引用计数法,引用加1不引用-1,为0的清除。清除不了相互引用的对象。 2.标记清除法:标记所有活动对象,清除所有没有被标记的对象,
编辑于 2024-04-24 14:41:21 回复(0)
浏览器垃圾回收根据数据的存储方式分为栈垃圾回收和堆垃圾回收。 1: 标记清除: 对所有活动对象进行标记,清除阶段会将没有标记的对象清除 2: 引用计数:一个对象不被其他对象引用时会被回,但存在循环引用时无法回收
编辑于 2024-02-22 10:59:22 回复(0)
1.标记清除:当变量进入执行环境时,对其进行标记,被标记的变量无法进行回收。在代码执行完毕后,对使用过的变量取消标记,清除阶段就是清除那些没有被标记的对象。 2.引用计数:当一个对象不被其他对象引用时会被回收 3.新生代和老生代:V8引擎将内存分为新生代和老生代两部分,新生代存放生存周期短的对象,老生代存放生存周期长的对象或常驻内存的对象 4.Scavenge算法:主要应用于新生代中,将内存空间分为From和To两部分,当From空间满了的时候,会将对象复制到To空间,并进行垃圾回收 5.标记整理算法:主要应用于老生代中,对堆中的对象进行标记,然后进行整理,把活动对象和非活动对象进行标记,回收非活动对象
发表于 2023-10-10 17:58:07 回复(0)
1.标记清除:执行前将所有的变量打上标记,执行完成后未被打上标记的变量就会当做垃圾回收,浏览器会隔一段时间进行一次标记清除。 (收集垃圾时程序会等待,且回收后的内存空间不连续,于是出现了 标记-整理机制,即回收后会整理内存空间,但效率又会降低一些 ) 2.引用计数:对对象的引用次数进行增加或减少,如果引用次数变为0,那么该对象分配的内存空间就会被立即清除。 (会出现相互引用的情况,导致对象一直无法被清除)
发表于 2023-09-05 17:06:12 回复(0)