iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >javascript有垃圾回收机制gc吗
  • 767
分享到

javascript有垃圾回收机制gc吗

2024-04-02 19:04:59 767人浏览 泡泡鱼
摘要

今天小编给大家分享的是javascript有垃圾回收机制GC吗,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。javascript中有GC(垃圾回收机

今天小编给大家分享的是javascript有垃圾回收机制GC吗,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。

javascript中有GC(垃圾回收机制)。JavaScript是使用垃圾回收机制的语言,执行环境负责在代码执行时管理内存,会自动将垃圾对象(没有被引用的对象)从内存中销毁。

JavaScript 中的垃圾回收机制(GC)

垃圾回收相关概念

① 什么是垃圾

没有被使用(引用)的对象就是垃圾

② 什么是垃圾回收

没有被引用的对象被销毁,内存被释放,就是垃圾回收

C、c++编程语言需要手动垃圾回收。

Java、JavaScript、PHPpython 等语言自动垃圾回收。

js中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作。我们需要做的只是要将不再使用的对象设置为 null 即可。

为什么需要垃圾回收

  • 在C / C++中,跟踪内存的使用和管理内存对开发者来说是很大的负担

    • JavaScript是使用垃圾回收机制的语言,也就是说执行环境负责在代码执行时管理内存,帮开发者卸下了这个负担

    • 通过自动内存管理实现内存的分配和资源的回收

    • 基本思路很简单,确定哪个变量不会再被使用了,把它的内存空间释放

    • 这个过程是周期性的,意思是这个垃圾回收程序每隔一段时间就会运行一次

  • 像JS中的对象、字符串、对象的内存是不固定的,只有真正用到的时候才会动态分配内存

    • 这些内存需在不使用后进行释放以便再次使用,否则在计算机可用内存耗尽后造成崩溃

  • 浏览器发展史上的垃圾回收法主要有

    • 引用计数法

    • 标记清除法

引用计数法

思路

  • 变量只是对值进行引用

  • 当变量引用该值时,引用次数+1

  • 当该变量的引用被覆盖或者清除时,引用次数-1

  • 当引用次数为0时,就可以安全地释放这块内存。

let arr = [1, 0, 1]   // [1, 0, 1]这块内存被arr引用  引用次数为1
arr = [0, 1, 0]  // [1, 0, 1]的内存引用次数为0被释放  
                 // [0, 1, 0]的内存被arr引用   引用次数为1
const tmp = arr  // [0, 1, 0]的内存被tmp引用   引用次数为2

循环引用问题

Netscape Navigator 3.0 采用

  • 在这个例子中,ObjectA和ObjectB的属性分别相互引用

  • 造成这个函数执行后,Object被引用的次数不会变成0,影响了正常的GC。

  • 如果执行多次,将造成严重的内存泄漏。

  • 而标记清除法则不会出现这个问题。

function Example(){

    let ObjectA = new Object();
    let ObjectB = new Object();

    ObjectA.p = ObjectB;
    ObjectB.p = ObjectA;   

}

Example();
  • 解决方法:在函数结束时将其指向null

ObjectA = null;
ObjectB = null;

标记清除法

为了解决循环引用造成的内存泄漏问题,Netscape Navigator 4.0 开始采用标记清除法

到了 2008 年,IE、Firefox、Opera、Chrome 和 Safari 都在自己的 JavaScript 实现中采用标记清理(或 其变体),只是在运行垃圾回收的频率上有所差异。

思路

  • 在变量进入执行上下文时打上“进入”标记

  • 同时在变量离开执行上下文时也打上“离开”标记

    • 从此以后,无法访问这个变量

    • 在下一次垃圾回收时进行内存的释放

function Example(n){
    const a = 1, b = 2, c = 3;
    return n * a * b * c;
}
// 标记Example进入执行上下文

const n = 1;  // 标记n进入执行上下文
Example(n);   // 标记a,b,c进入执行上下文
console.log(n); // 标记a, b, c离开执行上下文,等待垃圾回收

const和let声明提升性能

  • const和let不仅有助于改善代码风格,同时有利于垃圾回收性能的提升

  • const和let使JS有了块级作用域,当块级作用域比函数作用域更早结束时,垃圾回收程序更早介入

  • 尽早回收该回收的内存,提升了垃圾回收的性能

V8引擎的垃圾回收

V8引擎的垃圾回收采用标记清除法与分代回收法

分为新生代和老生代

新生代

新生代垃圾回收采用Scavenge 算法

分配给常用内存和新分配的小量内存

  • 内存大小

    • 32位系统16M内存

    • 64位系统32M内存

  • 分区

    • 新生代内存分为以下两区,内存各占一半

    • From space

    • To space

  • 运行

    • 实际运行的只有From space

    • To space处于空闲状态

  • Scavenge算法

    • 解决了内存散落分块的问题(不连续的内存空间)

    • 相当于用空间换时间。

    • 当From space内存使用将要达到上限时开始垃圾回收,将From space中的不可达对象都打上标记

    • 将From space的未标记对象复制到To space。

    • 然后清空From space、将其闲置,也就是转变为To space,俗称反转。

  • 新生代 -> 老生代

    • 内存大小达到From space的25%

    • 经历了From space <-> To space的一个轮回

    • 新生代存放的是新分配的小量内存,如果达到以下条件中的一个,将被分配至老生代

老生代

老生代采用mark-sweep标记清除和mark-compact标记整理

通常存放较大的内存块和从新生代分配过来的内存块

  • 内存大小

    • 32位系统700M左右

    • 64位系统1.4G左右

  • 分区

    • 存储编译后的代码

    • 存放存储对象的映射关系

    • 存放其他区域放不下的较大的内存,基本都超过1M

    • 字面的老生代,存放的是新生代分配过来的内存。

    • Old Object Space

    • Large Object Space

    • Map Space

    • Code Space

  • 回收流程

    • 标记完成之后,将标记为1类的对象进行内存释放

    • 采用深度优先遍历,遍历每个对象。

    • 首先将非根部对象全部标记为1类,然后进行深度优先遍历。

    • 遍历过程中将对象压入栈,这个过程中对象被标记为2类

    • 遍历完成对象出栈,这个对象被标记为3类

    • 整个过程直至栈空

    • 未被扫描,可回收,下面简称1类

    • 扫描中,不可回收,下面简称2类

    • 扫描完成,不可回收,下面简称3类

    • 标记分类(三色标记)

    • 遍历

    • Mark-sweep

  • Mark-compact


    • 垃圾回收完成之后,内存空间是不连续的。

    • 这样容易造成无法分配较大的内存空间的问题,从而触发垃圾回收。

    • 所以,会有Mark-compact步骤将未被回收的内存块整理为连续地内存空间。

    • 频繁触发垃圾回收会影响引擎的性能,内存空间不足时也会优先触发Mark-compact

垃圾回收优化

  • 增量标记

    • 如果用集中的一段时间进行垃圾回收,新生代倒还好,老生代如果遍历较大的对象,可能会造成卡顿。

    • 增量标记:使垃圾回收程序和应用逻辑程序交替运行,思想类似Time Slicing

  • 并行回收

    • 在垃圾回收的过程中,开启若干辅助线程,提高垃圾回收效率。

  • 并发回收

    • 在逻辑程序执行的过程中,开启若干辅助线程进行垃圾回收,清理和主线程没有任何逻辑关系的内存。

内存泄露场景

全局变量

// exm1
function Example(){
    exm = 'LeBron'   
}

// exm2
function Example(){
    this.exm = 'LeBron'
}
Example()

未清除的定时器

const timer = setInterval(() => {
    //...
}, 1000)

// clearInterval(timer)

闭包

function debounce(fn, time) {
  let timeout = null; 
  return function () {
    if (timeout) {
      clearTimeout(timeout);
    }

    timeout = setTimeout(() => {
      fn.apply(this, arguments);
    }, time);
  };
}

const fn = debounce(handler, 1000); // fn引用了timeout

未清除的DOM元素引用

const element = {
    // 此处引用了DOM元素
    button:document.getElementById('LeBron'),
    select:document.getElementById('select')
}

document.body.removeChild(document.getElementById('LeBron'))

如何检测内存泄漏

这个其实不难,浏览器原带的开发者工具PerfORMance就可以

  • 步骤

    • F12打开开发者工具

    • 选择Performance工具栏

    • 勾选屏幕截图和Memory

    • 点击开始录制

    • 一段时间之后结束录制

  • 结果

    • 堆内存会周期性地分配和释放

    • 如果堆内存的min值在逐渐上升则存在内存泄漏

优化内存使用

1、尽量不在for循环中定义函数

// exm
const fn = (idx) => {
    return idx * 2;
}

function Example(){
    for(let i=0;i<1000;i++){
        //const fn = (idx) => {
        //    return idx * 2;
        // }
        const res = fn(i);
    }
}

2、尽量不在for循环中定义对象

function Example() {
  const obj = {};
  let res = "";
  for (let i = 0; i < 1000; i++) {
    // const obj = {
    //   a: i,
    //   b: i * 2,
    //   c: i * 3,
    // };
    obj.a = i;
    obj.b = i * 2;
    obj.c = i * 3;
    res += JSON.stringify(obj);
  }
  return res
}

3、清空数组

arr = [0, 1, 2]
arr.length = 0; // 清空了数组,数组类型不变
// arr = []  // 重新申请了一块空数组对象内存

关于javascript有垃圾回收机制gc吗就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

--结束END--

本文标题: javascript有垃圾回收机制gc吗

本文链接: https://www.lsjlt.com/news/82929.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • javascript有垃圾回收机制gc吗
    今天小编给大家分享的是javascript有垃圾回收机制gc吗,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。javascript中有GC(垃圾回收机...
    99+
    2024-04-02
  • GC垃圾回收机制
    GC垃圾回收机制 一、 GC原理:1、为什么进行垃圾回收 二、JVM与回收算法:1、内存分配2、回收算法1、标记-清除(Mark-sweep)2、复制(Copying)3、标记-整理(Ma...
    99+
    2023-09-24
    jvm java 算法
  • JVM【类加载与GC垃圾回收机制】
    JVM【类加载与GC垃圾回收机制】 🍎一.JVM🍒1.1JVM简介🍒1.2JVM执行流程 🍎二.JVM运行时数据区...
    99+
    2023-09-06
    jvm java 开发语言
  • JavaScript中的垃圾回收机制
    聚沙成塔·每天进步一点点 ⭐ 专栏简介⭐ JavaScript的垃圾回收机制⭐ 内存管理⭐ 引用计数⭐ 标记-清除算法⭐ 内存泄漏⭐ 性能优化⭐ 使用`delete`操作符⭐ 注意循环中的变量...
    99+
    2023-10-05
    javascript 开发语言 ecmascript
  • 垃圾回收机制
      我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是...
    99+
    2023-01-30
    机制 垃圾
  • python垃圾回收机制!
    python的三种垃圾回收机制:1.python采用的是引用计数机制为主;2.标记-清除;为辅的策略3.分代收集(隔代回收、分代回收)为辅的策略 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内...
    99+
    2023-01-31
    机制 垃圾 python
  • 详解JavaScript的垃圾回收机制
    目录为什么需要垃圾回收(GC)什么是垃圾回收垃圾产生垃圾回收策略引用计数标记循环引用引发的问题解决方法引用计数算法的优缺点标记清除算法核心思想标记清除算法优缺点标记整理算法V8引擎的...
    99+
    2024-04-02
  • day09(垃圾回收机制)
    1,复习 文件处理 1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...
    99+
    2023-01-31
    机制 垃圾
  • 深入剖析 JavaScript 垃圾回收机制
    机制 JavaScript 使用“标记-清除”垃圾回收算法: 标记阶段:垃圾回收器遍布应用程序的内存,并标记所有仍在被使用的对象。 清除阶段:垃圾回收器释放所有未标记的对象占用的内存。 垃圾回收触发器 JavaScript 垃圾回收在...
    99+
    2024-04-02
  • 怎么理解JavaScript垃圾回收机制
    本篇内容介绍了“怎么理解JavaScript垃圾回收机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!机制说明找出不再使用的变量,然后释放它...
    99+
    2023-06-25
  • 详解 Java性能优化和JVM GC(垃圾回收机制)
    Java的性能优化,JVM GC(垃圾回收机制)在学习Java GC 之前,我们需要记住一个单词:stop-the-world 。它会在任何一种GC算法中发生。stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行...
    99+
    2023-06-02
  • JVM垃圾回收机制有什么用
    这篇文章主要介绍JVM垃圾回收机制有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.JVM的gc概述gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有...
    99+
    2023-06-17
  • JVM的垃圾回收机制你了解吗
    目录一:回收堆内存1.如何判定对象已死(可达性分析算法)2.对象的引用级别 3.对象的死亡过程二:垃圾回收算法1.标记清除算法2.标记复制算法3.标记整理算法三:垃圾收集器...
    99+
    2024-04-02
  • java 垃圾回收机制以及经典垃圾回收器详解
    判断对象存活方法 引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一。 会有对象循环引用问题: objA.instance =...
    99+
    2024-04-02
  • PHP垃圾回收机制讲解
    PHP的垃圾回收机制 垃圾回收机制是一种动态存储分配的方案。它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑...
    99+
    2024-04-02
  • 浅谈Java垃圾回收机制
    目录一.什么是垃圾二.怎么回收垃圾2.1 静态对象什么时候变成垃圾被回收2.2 新生代和年老代三、垃圾回收算法3.1 标记清除算法3.2 复制清除算法(专门用于处理年轻代垃圾的)3....
    99+
    2024-04-02
  • python垃圾回收机制有什么用
    Python的垃圾回收机制主要有以下几个作用: 自动释放内存:Python的垃圾回收机制可以自动检测不再使用的内存对象,并将其释...
    99+
    2023-10-25
    python
  • Python垃圾回收机制详解
    目录1. 引用计数2. 标记-清除3. 分代回收4. 其他4.1 JNI(Java Native Interface)总结 Python 的GC模块主要运用了引用计数来跟踪和回收垃圾...
    99+
    2024-04-02
  • 一文带你了解JavaScript垃圾回收机制
    目录1. 概述 2. 内存管理 3. 垃圾回收 4. GC算法介绍 5. 引用计数算法 1. 引用计数优缺点 6. 标记清除算法 1. 标记清除算法优缺点 7. 标记整理算法 8. ...
    99+
    2024-04-02
  • go语言有垃圾回收吗
    go语言有垃圾回收。Go语言自带垃圾回收机制(GC);GC通过独立的进程执行,它会搜索不再使用的变量,并将其释放。在计算中。内存空间包含两个重要的区域:栈区 (Stack) 和堆区 (Heap);栈区一般存储了函数调用的参数、返回值以及局部...
    99+
    2023-05-14
    垃圾回收 Go Golang go语言
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作