一文搞懂javascript垃圾回收机制

工程师-小白 工程师-小白     2022-12-11     212

关键词:

一文搞懂JavaScript垃圾回收机制(GC)


在这之前首先应该搞明白堆和栈的知识

堆和栈

  • :JavaScript中的基本数据类型都是存在栈中的,他 的地址是固定的,并且是连续的,后进先出。由系统空间自动分配和释放,相对于堆来说,更容易管理内存空间
  • :JavaScript中的引用数据类型都是存在堆中的,虽然说是存放在堆中,但是他们的地址是存储在栈中的,需要从栈中先获得对象的地址指针,然后通过地址来找到堆中的数据,堆是动态分配内存,内存大小不一,地址也不是连续的。

垃圾回收

垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。(说白了就是,内存空间不够了,但是没有别的人用你,我就把你回收了)
发生地点: 堆内存中,因为回收的主要是对象,而对象都是存放在堆内存中
发生时间: 程序空闲时间内,不定时回收
JavaScript的垃圾回收机制:首先需要程序自动的判断这个对象是否可以被回收,如果可以被回收了就标记一下,然后等到下一次执行垃圾回收的时候把有标记的对象全部清除

确定内存需要被回收的方法

方法一: 引用计数:就是给对象加上一个计数器,当用到这个对象的时候加1,用完了之后-1,最终回收计数为0的对象

方法二: 可达性分析:jvm在做垃圾回收的时候。首先需要找出来所有可能作为GCRoot的对象,然后就会顺着这些根元素顺藤摸瓜的向下找,找到的对象就标记为正在使用的对象,没有找到的对象就是没用在用的对象,就可以进行回收了。**(现在基本都是采用这种方法)**可作为 GC Root 的对象包括以下几种:(GCROOT就是找到老大哥,这个老大哥可以用一部分小弟,小弟还可以用到小小弟,一直到最后都没有人用到的小弟,就可以被作为回收对象进行标记)

  1. 虚拟机栈中正在引用的对象
  2. 本地方法栈用正在引用的对象
  3. 静态属性引用的对象
  4. 方法区常量引用的对象

确定内存被回收后,需要用的垃圾回收算法

  1. 标记清楚算法: 先识别出所有需要回收的算法,然后进行清除 **缺点:**回收之后会产生大量的不连续的内存碎片,如果在后期运行过程中,需要用到连续的内存空间,就不会使用这些空间,早程内存浪费
  2. 复制算法: 将内存空间分为两份,每次只使用其中一份,当满了之后把有效的空间(就是活着的对象)放到另一块内存区域中,
    优点: 可以避免内存不连续,得到的内存空间都是连续的,
    缺点: 就是会浪费一半的内存空间。
  3. 标记-整理算法: 标记过程与标记-清除算法一样,标记完成之后,将存货的对象向一端移动,确保移动后的对象占用连续的内存空间然后直接清理调边界以外的内存。
    优点: 不会产生内存碎片,
    缺点: 整理阶段存在效率问题,适合老年代这种垃圾回收频率不是很高的场景
  4. 分代收集算法
    根据对象的存货周期,将划分为几个区域,不同区域采用合适的垃圾收集算法。
    新生代: 主要是用来存放新生的对象。一般占据堆空间的1/3,由于频繁创建对象,所以新生代会频繁触发垃圾回收。
    新生代分为Eden区、ServivorFrom、ServivorTo三个区
    新生代理解: 目的是回收那些生命周期短的对象,主要存放新产生的对象。新生代按照8:1:1分为eden区、survivor0、survivor1,大部分对象在eden区中生成,当eden满时,将存活的对象复制到survivor0,然后清空eden,当eden、survivor0都满了时,将这两个区中存活的对象复制到survivor1,然后清空eden、survivor0,当着三个区都满了时则把存货对象复制到老年代,如果老年代也满了则触发FullGC。新生代的全回收叫MinorGC,MinorGC发生频率比较高,不一定等到新生代满了时才进行。
    (说白了就是 新生代给分为三个去 大哥 二哥和三弟,有钱(对象)了 先可着大哥来,大哥装不下了,又发钱了,大哥先把看看兜里面的钱,旧的 褶皱的不能花了就扔掉(把垃圾对象清除),然后把其余的钱都给二哥和三弟,自己再去拿新给的钱)
    老年代: 老年代的对象比较稳定,所以MinorGC(就是垃圾回收)不会频繁执行。
    新生代使用的是复制算法而老年代使用的是标记整理算法

一文搞懂php的垃圾回收机制(代码片段)

〝古人学问遗无力,少壮功夫老始成〞一文搞懂php的垃圾回收机制,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力&... 查看详情

一文搞懂g1垃圾回收器

...及相关的材料,从整体上梳理了G1的过程,希望这一文能帮你真正搞懂G1垃圾回收器。目录1基本特征2图解G1对象分配与回收过程3深入理解G1垃圾回收过程3. 查看详情

一文读懂python垃圾回收机制收藏版(代码片段)

得益于Python的自动垃圾回收机制,在Python中创建对象时无须手动释放。这对开发者非常友好,让开发者无须关注低层内存管理。但如果对其垃圾回收机制不了解,很多时候写出的Python代码会非常低效。垃圾回收算法有... 查看详情

一文读懂python垃圾回收机制收藏版(代码片段)

得益于Python的自动垃圾回收机制,在Python中创建对象时无须手动释放。这对开发者非常友好,让开发者无须关注低层内存管理。但如果对其垃圾回收机制不了解,很多时候写出的Python代码会非常低效。垃圾回收算法有... 查看详情

2022前端面经---(js高级)一文让你搞懂闭包(代码片段)

CSDN话题挑战赛第2期参赛话题:面试宝典✅作者简介:一名迈入大三的大学生,致力于提高前端开发能力✨个人主页:前端小白在前进的主页🔥系列专栏:2022面经⭐️个人社区:个人交流社区🍀学习格... 查看详情

一文搞懂g1垃圾回收器

...及相关的材料,从整体上梳理了G1的过程,希望这一文能帮你真正搞懂G1垃圾回收器。目录1基本特征2图解G1对象分配与回收过程3深入理解G1垃圾回收过程3.1YoungGC过程3.2FullGC和MixGC过程1基本特征G1从JDK7开始就有了,从JDK... 查看详情

你真的理解java垃圾回收吗?万字长文带你彻底搞懂垃圾回收机制(代码片段)

Java垃圾回收机制垃圾回收主要关注Java堆Java内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上... 查看详情

javascript垃圾回收机制

JavaScript垃圾回收机制1垃圾为何要产生并回收2垃圾回收机制2.1标记清除法2.2引用计数法3V8对垃圾回收机制的优化——分代式垃圾回收机制3.1新生代与老生代3.2新生代的垃圾回收3.3老生代的垃圾回收1垃圾为何要产生并回收当我们... 查看详情

javascript中的的垃圾回收机制

JavaScript中的的垃圾回收机制javascript的垃圾回收原理(1)、在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收; (2)、如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回... 查看详情

javascript垃圾回收机制

js在声明一个函数,方法,数据的时候会开辟出新的空间,但数据不会被使用到的时候,就会被回收functionfn(){varo={}varoa={}o.a=oaoa=oreturn"ddd"}fn()o与oa相互引用的时候就不会触发垃圾回收机制 查看详情

javascript的垃圾回收机制

  在js中,所需内存的分配以及无用内存的回收完全实现了自动管理。垃圾收集机制原理:找出那些不再使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性的执行... 查看详情

聊聊javascript垃圾回收机制-v8引擎下的垃圾回收机制(代码片段)

引子从修真故事说起上文大概介绍了垃圾回收的机制和标记清除法的核心思路,接下来准备深入介绍下v8引擎里的垃圾回收算法。既然是算法类的介绍,那自然是比较枯燥的,如果想完全弄懂,可以收藏下来,多看几遍(!·_·!)... 查看详情

一文带你了解java中的垃圾回收机制(代码片段)

🌊博主简介:CSDN原力作者,华为云享专家,掘金优秀作者🌊个人博客:haiyong.site🌊粉丝专属福利:简历模板、PPT模板、学习资料、面试题库。文末领取直接跳到末尾领取资料介绍在C/C++中&#x... 查看详情

一文带你了解java中的垃圾回收机制(代码片段)

🌊博主简介:CSDN原力作者,华为云享专家,掘金优秀作者🌊个人博客:haiyong.site🌊粉丝专属福利:简历模板、PPT模板、学习资料、面试题库。文末领取直接跳到末尾领取资料介绍在C/C++中&#x... 查看详情

javascript-垃圾回收机制(代码片段)

欢迎学习交流!!!持续更新中…文章目录JS的垃圾回收机制标记清除引用计数JS的垃圾回收机制      众所周知,应用程序在运行过程中需要占用一定的内存空间,且在运行过后就必须将不再用到的内存释... 查看详情

一文读懂python垃圾回收机制收藏版(代码片段)

得益于Python的自动垃圾回收机制,在Python中创建对象时无须手动释放。这对开发者非常友好,让开发者无须关注低层内存管理。但如果对其垃圾回收机制不了解,很多时候写出的Python代码会非常低效。垃圾回收算法有... 查看详情

一文读懂python垃圾回收机制收藏版(代码片段)

得益于Python的自动垃圾回收机制,在Python中创建对象时无须手动释放。这对开发者非常友好,让开发者无须关注低层内存管理。但如果对其垃圾回收机制不了解,很多时候写出的Python代码会非常低效。垃圾回收算法有... 查看详情

javascript中的垃圾回收机制与内存泄露

什么是内存泄露?  任何编程语言,在运行时都需要使用到内存,比如在一个函数中,vararr=[1,2,3,4,5];这么一个数组,就需要内存。   但是,在使用了这些内存之后,如果后面他们不会再被用到,但是还没有及时释放,... 查看详情