JavaScript暂时性死区与垃圾回收机制是什么


本篇内容介绍了“JavaScript暂时性死区与垃圾回收机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们来看一个例子上面两条语句都会报错,因为初始化前无法访问但是我们知道var定义的变量,是存在变量提升的,我们来看一下其原理:任何代码运行前都会经历预编译阶段,但它占用的时间往往极其短暂,所以我们一般感知不到,它主要是在内存中开辟一些空间以此来存放变量与函数。预编译时,js引擎创建执行上下文,会将当前作用域中的变量和函数声明提升到顶部而暂时性死区是一种对于变量提升的限制当一个变量被声明时,在变量声明前访问该变量会抛出ReferenceError异常。这种行为称为暂时性死区(TDZ,Temporal Dead Zone),存在于用let和const声明的变量身上本质上是由于变量声明被提升,但是变量的赋值操作不会被提升,但是又不会像var一样给一个默认的undefined,因此在变量声明前访问该变量会抛出异常,类似于C语言中使用没有初始化的野指针,指针指向的堆或栈空间会暂时无法访问例如:说到垃圾回收机制,我们首先要了解什么是内存泄漏简单来说,我们主机的内存空间是有限的,内存泄漏就是在运行程序时减少了我们可用的内存,一般有用的内存占用叫正常使用,而用过之后不需要留着的东西占着内存空间却不释放,就叫内存泄漏在JavaScript中,内存泄漏通常是由于以下几个原因导致的:全局变量:没有使用var、let或const关键字声明的变量会被自动添加到全局对象中,如果意外地创建了全局变量,可能会导致这些变量无法被垃圾回收器释放。定时器或回调函数:在创建定时器或回调函数时,如果没有及时清除它们,可能会导致它们一直占用内存空间,直到页面关闭。DOM节点引用:在操作DOM节点时,如果保存了节点的引用,但是没有及时释放引用,可能会导致节点一直占用内存空间,直到页面关闭。闭包:在使用闭包时,如果闭包中引用了外部变量,但是没有及时释放闭包,可能会导致外部变量无法被垃圾回收器释放。循环引用:在创建对象时,如果对象之间存在循环引用关系,可能会导致这些对象一直占用内存空间,直到页面关闭。而JavaScript垃圾回收机制就是使用自动内存管理技术,它会自动检测哪些变量、对象和数据不再被使用,然后自动释放它们所占用的内存空间那么它是如何实现的呢?一般有以下两种算法:引用计数,它的基本思路是为每个对象维护一个引用计数器,当一个对象被引用时,计数器加1,当对象不再被引用时,计数器减1,当计数器的值为0时,表示该对象不再被使用,可以被垃圾回收器释放。引用计数算法可以快速地处理不再被引用的对象,但是它无法处理循环引用的情况,因此在实际应用中很少使用标记清除,它的基本思路是通过标记所有可以访问到的对象,然后清除所有未被标记的对象。在JavaScript中,垃圾回收器会从全局对象开始遍历内存中的所有对象,标记所有可以访问到的对象,然后清除所有未被标记的对象。标记清除算法可以有效地处理循环引用的情况,但是它需要占用大量的时间和内存空间,因此在执行过程中可能会出现性能问题。基于此,v8引擎就对垃圾回收机制做了优化首先是分代垃圾回收,将分为新生代老生代两个区域,新生代中存储的是生命周期较短的对象,而老生代中存储的是生命周期较长的对象。新生代区域使用Scavenger算法,老生代区域使用Mark-Sweep(标记清除)和Mark-Compact(标记压缩)即标记算法。其次是增量式垃圾回收,将整个垃圾回收的过程分为多个小步骤,在每个小步骤之间可以插入一些JavaScript代码的执行。这种方式可以避免垃圾回收造成的长时间的页面卡顿。最后是标记压缩Mark-Compact,由于标记清除Mark-Sweep会清除未标记的对象,导致只回收不连续的内存块,这样还有有很多内存块碎片虽然被清除,仍无法使用。标记压缩法就是,V8引擎在老生代区域中,对标记存活的对象进行迁移,再将移动后的存活对象的地址重新映射到新的位置,然后清除原地址内存块,这样可用内存块就不会是碎片化,导致难以使用。但是移动对象的过程肯定也是免费云主机域名影响性能的,不能过于频繁。再有就是在V8引擎中,垃圾回收的频率是动态可变的,V8引擎在启动时设置的最大堆大小,一旦堆中的对象数量超过了阈值,V8引擎会立即启动垃圾回收器。一般情况下,V8引擎是根据当前堆中的对象数量、内存使用情况、CPU占用率等来自动计算的垃圾回收间隔时间。除自动调节垃圾回收频率外,还可以通过手动触发垃圾回收来调节垃圾回收的频率。如在js中使用window.gc()方法手动触发垃圾回收。还可以在Node.js中可以通过–max-old-space-size参数来设置老生代堆内存的阈值大小,通过–max-new-space-size参数来设置新生代阈值的大小“JavaScript暂时性死区与垃圾回收机制是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: PHP设计模式之解释器模式怎么实现

这篇文章主要介绍“PHP设计模式之解释器模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP设计模式之解释器模式怎么实现”文章能帮助大家解决问题。解释器模式是一种行为型模式,它定义了一种语言文法,并且定义了…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/07 16:27
Next 07/07 16:35

相关推荐