首页 > 其他分享 >js垃圾回收的方式有哪些?

js垃圾回收的方式有哪些?

时间:2024-11-29 13:46:29浏览次数:10  
标签:垃圾 标记 对象 回收 js 引用 内存

JS 的垃圾回收主要有两种方式:

  1. 标记清除(Mark-and-Sweep):

    这是最常用的垃圾回收方式。它分为两个阶段:

    • 标记阶段: 垃圾回收器从根对象(例如全局对象)开始遍历,标记所有可访问的对象。可访问的对象指的是那些仍然被引用的对象。
    • 清除阶段: 垃圾回收器遍历堆内存,清除所有未被标记的对象,也就是那些不可访问的对象,释放它们占用的内存。

    优点: 实现简单,可以有效回收循环引用导致的内存泄漏。

    缺点: 清除阶段需要遍历整个堆内存,效率较低;清除后会产生内存碎片,导致分配大块内存时效率降低。

  2. 引用计数(Reference Counting):

    这种方式不太常用,因为它无法处理循环引用。它的原理是:

    • 每个对象都有一个引用计数器。
    • 当一个对象被引用时,计数器加 1。
    • 当一个对象不再被引用时,计数器减 1。
    • 当计数器为 0 时,对象被回收。

    优点: 回收及时,不会造成明显的卡顿。

    缺点: 无法处理循环引用,即使循环引用的对象不再被外部引用,它们的引用计数也不会为 0,导致内存泄漏。

现代浏览器通常采用标记清除算法或其变种,例如:

  • 标记整理(Mark-Compact/Sweep-Compact): 在标记清除的基础上,将存活的对象移动到内存的一端,消除内存碎片,提高内存分配效率。
  • 增量式标记清除(Incremental Mark-and-Sweep): 将标记清除过程分成多个小步骤,穿插在 JavaScript 代码执行过程中,减少垃圾回收造成的卡顿。
  • 分代式垃圾回收(Generational Garbage Collection): 将对象分为新生代和老生代,对新生代对象进行更频繁的垃圾回收,因为新生代对象通常生命周期较短,可以提高效率。

总而言之,理解 JS 垃圾回收机制有助于编写更高效的代码,避免内存泄漏。 虽然开发者不需要手动管理内存,但了解这些机制可以帮助你更好地理解代码的性能表现。

标签:垃圾,标记,对象,回收,js,引用,内存
From: https://www.cnblogs.com/ai888/p/18576501

相关文章

  • 举例说明js创建数组有哪些方法?
    JS创建数组有多种方法,以下列举几种常见的方式并举例说明:数组字面量(ArrayLiteral):这是最常用且最简洁的方法。使用方括号[]包含数组元素,元素之间用逗号分隔。constarr1=[1,2,3,"hello",true,{name:"John"}];//包含不同数据类型的数组constemptyArr=......
  • 用js封装一个对cookie操作的方法
    /***Cookie操作工具类*/constCookieUtil={/***设置cookie*@param{string}namecookie名称*@param{string}valuecookie值*@param{Object}options可选参数*-{number}expires过期时间(单位:天)*-{string}path......
  • 用js实现最大化和最小化窗口
    //最大化窗口functionmaximizeWindow(){if(window.innerWidth<screen.availWidth||window.innerHeight<screen.availHeight){if(document.documentElement.requestFullscreen){document.documentElement.requestFullscreen();}elseif(d......
  • 个人js相关方法实现
    js判断类型的方法实现//设置为全局方法,返回方法的小写类型(function(){window.getTypeLowerCase=function(param){//consttoString=Object.create({}).toString;consttoString={}.toString;returntypeofparam==='object'?......
  • node.js毕设基于微信小程序的图书推荐系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于图书推荐系统的研究,现有研究主要集中在网页端或者独立APP的开发上,专门针对微信小程序这一平台开发图书推荐系统的研究较少。在国内外,图书推荐系统多......
  • js模块化
    JavaScript模块化规范1.模块化概述什么是模块化?将程序文件依据一定规则拆分成多个文件,这种编码方式就是模块化的编码方式拆分出来的每个文件就是一个模块,模块中的数据都是私有的,模块之间相互隔离同时也能通过一些手段,可以把模块内的指定数据“交出去”,供其他模块使用......
  • JS的异步函数的理解
    异步函数是JavaScript语言中的一个重要特性,它使得编写异步代码变得更加直观和易于管理。以下是对异步函数的深入理解:1. 概念理解异步函数是使用async关键字声明的函数。当这样的函数被调用时,它返回一个Promise对象。这使得异步函数在语法上看起来与普通同步函数非常相似,但它......
  • JS怎么实现Module模块化?
    在JavaScript中实现模块化主要有两种方式:CommonJS和ES6模块。以下是这两种方法的基本实现:CommonJSCommonJS是Node.js的原生模块系统,但它也可以在浏览器环境中使用通过构建工具如Webpack或Browserify。模块导出://myModule.jsmodule.exports={myFunction:function(......
  • js中的事件委托
    事件委托就是使用事件冒泡机制将子元素相关事件绑定到父元素的处理方式。假设场景:当我们在开发过程中有toolbar功能开发,toolbar中每个按钮都会触发不同的相关功能(弹窗,左边栏,右边栏,跳转等),如果给每一个按钮绑定click事件,不仅代码量多,而且不方便维护,因此需要使用事件委托,将子元素所......
  • Golang - json omitempty的用法
    omitempty的作用是在json数据结构转换时,当该字段的值为该字段类型的零值时,忽略该字段。packagemainimport("fmt""encoding/json")typeStudentstruct{Namestring`json:"name"`Ageint`json:"age"`Gradestring`json:"......