首页 > 试题广场 >

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

[问答题]
有两种机制:1、标记清除:对所有活动对象进行标记,清除阶段会将没有标记的对象清除;标记整理算法:标记结束后,算法将活动对象压入内存一端,则需要清理的对象在边界,直接被清理掉就行。(效率低) 2、引用计数:将对象是否不再需要简化定义为有没有其他对象引用它,如果没有引用指向这个对象,则会被垃圾回收机制回收。(内存空间不连续)
发表于 2022-05-23 10:06:18 回复(0)
引用计数:一个对象不被其他对象引用时会被回收 问题:循环引用时无法回收 标记-清除:从根元素开始,周期性标记可被访问的对象,同时回收不可被访问的对象 问题:收集垃圾时程序会等待,且回收后的内存空间不连续,于是出现了 标记-整理机制,即回收后会整理内存空间,但效率又会降低一些
发表于 2022-05-06 10:25:18 回复(0)
浏览器的垃圾回收机制就是我们程序在工作的过程中或者执行之后,会产生一些用不到的内存变量,这些变量会一直占据这内存,所以这时候需要垃圾回收机制帮我清理这些用不到的变量,从而释放内存空间。垃圾回收机制最常见的有两种:1.标记清除算法。2:引用计数算法。标记清除算法就是执行前将所有的变量打上标记,执行完成后未被打上标记的变量就会当做垃圾回收。浏览器会隔一段时间进行一次标记清除标记清除算法的缺点:被释放的掉的内存空间是不连续被,之前一直占据内存的变量隔开,导致内存空间不连续,会出现分配不一的问题。引用计数算法:就是对对象的引用次数进行增加或者减少,如果引用次数变为0,那么该对象分配的内存空间立即就会被清除掉。缺点就是会出现相互引用的情况。会导致对象一直被引用无法被清除
发表于 2022-08-04 10:19:04 回复(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)
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)
1.标记清除:所有活动对象都会被标记,,清除阶段将没有标记的对象清除 2.引用清除:没有引用指向这个对象时会被垃圾回收机制回收
发表于 2023-08-12 17:22:21 回复(0)

JavaScript是一种广泛应用于浏览器和服务器端的脚本语言垃圾回收是它的一个重要特性

JavaScript垃圾回收机制通过标记和清除等算法来管理内存,避免内存泄漏和内存溢出,保证代码的性能和稳定性。

JS垃圾回收的指导原则

JavaScript垃圾回收的指导原则包括以下几点:

  1. 内存自动分配:JavaScript引擎通过垃圾回收器自动分配内存,程序员无需手动管理内存。

  2. 垃圾自动回收:JavaScript垃圾回收器会自动识别不再使用的对象,并回收这些垃圾。程序员不需要手动释放内存。

  3. 对象的引用计数:JavaScript垃圾回收器使用引用计数算法来检测和回收不再使用的对象。

  4. 循环引用的处理:一旦对象之间形成了循环引用,就不再能够被直接回收。垃圾回收器使用标记-清除算法来检测和处理这种情况。

  5. 分代回收:JavaScript垃圾回收器将堆分为多个代,每个代有自己的回收策略。这种分代回收的策略可以充分利用对象的生命周期特征,提高回收效率。

这些指导原则可以帮助程序员更好地理解JavaScript内存管理和垃圾回收的基础原理,从而更好地编写高效、稳定的JavaScript代码。

发表于 2023-07-28 15:29:53 回复(0)
浏览器垃圾回收机制分为两种:1. 标记清除法2. 引用计数法. 大多数浏览器都是基于标记清除法再加上自己的优化来实现垃圾回收的. 在V8中采用的分代式垃圾回收, 将堆分为新生代和老生代区域, 新生代区域存放的都是些生存周期短的对象,内部会采用Scvenge算法进行垃圾回收,当经过多轮迭代复制后,仍然存在对象将被移入老生代区域,由于JS是单线程语言, 进行垃圾回收时,会阻塞页面进行操作也就是全阻塞,为此有需要引进辅助线程进行并行回收;老生代区域存放的生存周期长的对象, 因为生存周期长, 所以老生代区域清理垃圾的时间间隔也相比更长一点, 老生代采用并法回收
发表于 2023-04-06 13:25:08 回复(0)
我们将已经使用过,后面不会再使用的数据成为垃圾数据。垃圾数据会存放在内存里,占据空间越来越大,为了防止内存泄漏,我们需要垃圾回收机制进行清理。两种机制:1.标记清理:将活动对象进行标记,清理的时候没被标记的就会被清除。标记整理算法:算***将活动对象压入内存一侧,这样要清理的对象就在边界,就可以直接清理。2.引用计数:将对象是否不再需要简单定义为是否有对象进行引用,没有就回收
发表于 2023-03-21 21:52:50 回复(0)
1、标记清除法 当我们生名一个变量事会给一个标记,当变量使用完毕后再次标记然后进行清除回收 2、引用计数发 当我们生名一个变量事会被+1 当变量赋值到另一个变量时再次加1,然后等到变量的值为0时会被清除
发表于 2023-03-13 22:29:04 回复(0)
浏览器垃圾回收机制包括标记清除, 标记整理,增量标记。垃圾回收开始后,会从根元素开始,访问所有可以被访问到的对象,同时对不能访问的对象进行回收操作。标记整理:在每一次标记清除完毕后,会将内存中存在的对象进行整理放置在一起,减少内存碎片的存在。增量标记:会在浏览器闲暇时在后台进行垃圾回收,增大垃圾回收的频率,减少用户的卡顿感。
编辑于 2023-03-09 10:46:03 回复(0)
浏览器将对象分为长久对象和临时对象,长久对象通常是全局的window/dom的对象属于长久对象,而方法或者块级中属于临时对象。分别对象主垃圾回收器和副垃圾回收器。当清除长久对象的时候,会对所有可达的对象进行标记,然后将未被标记的对象回收,但是回收之后会造成大量的内存碎片。当清除临时对象的时候,一般临时对象不超过8M,分为对象区域和空闲区域,将新增的对象放进对象区域,当对象区域快满的时候,会进行清理,遍历对象区域并标记,如果可达的对象被放入空闲区域,然后两个区域对调,这种方式不会产生垃圾碎片。
发表于 2023-02-18 20:41:55 回复(0)