首页 > 系统相关 >JavaScript 内存管理及垃圾回收

JavaScript 内存管理及垃圾回收

时间:2023-01-22 12:11:54浏览次数:48  
标签:标记 对象 引用 JavaScript 回收 算法 内存 垃圾

一、内存管理

JavaScript 是一种自动垃圾回收语言,这意味着 JavaScript 引擎会自动监测和清理无用的内存。

JavaScript 中的内存管理主要由 JavaScript 引擎负责,开发人员不需要手动管理内存。JavaScript 引擎使用垃圾回收算法来实现自动垃圾回收。

二、垃圾回收

JavaScript 垃圾回收算法是指在 JavaScript 程序中,用来回收不再使用的内存的算法。常见的垃圾回收算法包括:

  • 标记-清除算法:标记出所有不再使用的对象,然后清除它们。
  • 引用计数算法:维护每个对象的引用计数,当计数为0时回收对象。
  • 标记-整理算法:标记出所有不再使用的对象,然后将所有存活的对象整理到一起,回收其他对象。
  • 增量标记-整理算法:将垃圾回收过程分成多个小步骤执行,并且可以处理循环引用问题。

现代 JavaScript 引擎通常采用增量标记-整理算法或其他类似算法来实现垃圾回收。

1、标记-清除算法

标记-清除算法是通过标记未使用的内存块,然后清除这些标记的内存块来实现垃圾回收的。

标记-清除算法的工作流程如下:

  1. 从根节点开始,遍历所有可达的对象,将其标记为“可用”。
  2. 扫描内存中所有对象,将未被标记的对象标记为“不可用”。
  3. 清除所有不可用对象占用的内存。

标记-清除算法的优缺点

优点:

  • 标记-清除算法简单易实现。
  • 标记-清除算法可以回收任意类型的对象。

缺点:

  • 标记-清除算法会产生碎片化的内存,这可能导致空间浪费。
  • 标记-清除算法会产生暂停,这可能导致程序卡顿。

现在,由于标记-清除算法会产生碎片化的内存和暂停,所以现代的 JavaScript 引擎主要使用增量标记-整理算法来实现垃圾回收。增量标记-整理算法将垃圾回收过程分成多个小步骤执行,避免了长时间的暂停。

标记-清除算法是一种简单易实现的垃圾回收算法,但是会产生碎片化的内存和暂停,因此现在不再常用。

2、引用计数算法

引用计数算法是通过跟踪每个对象的引用次数来确定对象是否被使用,如果一个对象的引用次数为0,则该对象被视为垃圾并被回收。

引用计数算法的工作流程如下:

  1. 每当一个对象被引用时,将其引用计数增加1。
  2. 每当一个对象的引用被删除时,将其引用计数减少1。
  3. 当一个对象的引用计数为0时,该对象被视为垃圾并被回收。

引用计数算法的优缺点

优点:

  • 引用计数算法可以实时回收垃圾。
  • 引用计数算法可以较快地回收循环引用的对象。

缺点:

  • 引用计数算法无法处理循环引用问题。如果两个对象相互引用,而没有其他变量引用它们,则它们的引用计数都为1,而它们都不能被回收。
  • 引用计数算法会增加程序的运行时间和空间开销。

引用计数算法在处理循环引用问题上会有困难。而且引用计数算法会增加程序的运行时间和空间开销。因此现代的 JavaScript 引擎不再使用引用计数算法来实现垃圾回收。

引用计数算法的实现方式可以是各种各样的, 例如:

  • 对于每一个对象都维护一个计数器,在有新的引用时将计数器加一,在引用结束时将计数器减一。
  • 对于每一个对象维护一个引用链表,在有新的引用时将引用的对象加入链表中,在引用结束时将引用的对象移除链表。

虽然现在的 JavaScript 引擎不再使用引用计数算法来实现垃圾回收,但是对于引用计数算法的理解对于理解其他算法有很大帮助。

3、标记-整理算法

标记-整理算法是一种垃圾回收算法,它首先标记出所有不再使用的对象,然后将所有存活的对象整理到一起,回收其他对象。

标记-整理算法的工作流程如下:

  1. 标记:从根节点开始,遍历所有可达的对象,将其标记为“存活”。
  2. 整理:将所有存活的对象移动到一起,以便进行回收。
  3. 回收:回收所有未被标记的对象占用的内存。

标记-整理算法的优缺点

优点:

  • 可以有效地处理循环引用问题。
  • 可以减少内存碎片化。

缺点:

  • 整理过程会影响性能。
  • 需要额外的空间来存储活动对象和空闲对象。

标记-整理算法在处理循环引用问题上会有优势,减少内存碎片化,但是会影响性能,需要额外的空间来存储活动对象和空闲对象。

标记-整理算法是一种较为新的垃圾回收算法,相对于标记-清除算法和引用计数算法而言,它可以更好地解决循环引用问题。

在使用标记-整理算法进行垃圾回收时,系统会标记出所有仍然在使用的对象,然后将这些对象移动到一起,这样就可以避免内存碎片化,并且可以减少循环引用问题的影响。

但是,标记-整理算法也有缺点,整理过程会影响性能,需要额外的空间来存储活动对象和空闲对象。另外,在 JavaScript 引擎中,这种算法也没有得到广泛采用,大多数 JavaScript 引擎使用的是增量标记-整理算法或其他类似算法。

4、增量标记-整理算法

现代的 JavaScript 引擎主要使用增量标记-整理算法来实现垃圾回收,这种算法在运行时将垃圾回收过程分成多个小步骤来执行,避免了长时间的暂停。

增量标记-整理算法的工作流程如下:

  1. 标记:从根节点开始,遍历所有可达的对象,将其标记为“存活”。
  2. 整理:将所有未被标记的对象移动到一起,以便进行回收。
  3. 回收:回收所有未被标记的对象占用的内存。

增量标记-整理算法通过将垃圾回收过程分成多个小步骤执行,来避免了长时间的暂停。这样可以在不影响用户体验的情况下进行垃圾回收。

增量标记-整理算法的优缺点

优点:

  • 避免了长时间的暂停,提高了程序的响应性。
  • 增量标记-整理算法可以有效地处理循环引用问题。

缺点:

  • 由于增量标记-整理算法是一种标记-整理算法,所以会产生碎片化的内存,这可能降低内存利用率。
  • 增量标记-整理算法的实现需要额外的空间来存储活动对象和空闲对象。

增量标记-整理算法是基于标记-清除算法和标记-整理算法的结合体。它首先使用标记-清除算法找出所有存活的对象,然后使用标记-整理算法将这些对象移动到一起,以便进行回收。

三、性能优化措施

JavaScript 中没有强制垃圾回收的方法,也没有手动释放内存的方法, JavaScript 引擎会根据需要自动进行垃圾回收。

在 JavaScript 中,当一个对象不再被任何变量引用时,它就会被视为垃圾并被回收。需要注意的是,JavaScript 中的垃圾回收仅针对不再使用的内存,而不是不再使用的变量。例如,如果一个变量存储的是对象的引用,则该对象可能不再被其他变量引用,但仍然可能被使用。

还有一些开发人员可以采取的优化措施来提高程序的性能。例如,在不再使用的时候将变量赋值为 null 或 undefined,可以帮助 JavaScript 引擎更快地找到垃圾。

 

需要注意的是,JavaScript 中的垃圾回收并不能保证程序一定不会出现内存泄漏的情况,例如循环引用,开发人员需要知道这种情况并采取对应的处理措施。

总之,JavaScript 中的内存管理主要由 JavaScript 引擎负责,开发人员不需要手动管理内存。JavaScript 中的垃圾回收是自动进行的,开发人员只需要了解垃圾回收机制并采取优化措施,就可以帮助程序更好的管理内存。

标签:标记,对象,引用,JavaScript,回收,算法,内存,垃圾
From: https://www.cnblogs.com/yuzhihui/p/17064331.html

相关文章

  • C++内存分配方法new与placement new使用方法详解
    tags:C++写在前面总结一下C++内存分配中的​​new​​​/​​delete​​​方法,以及一个很有意思的工具:​​placementnew​​.参考:cppprimer5ed,pp409,pp726(19.1).......
  • go内存逃逸
    逃逸分析go在编译时确定是否逃逸,逃逸分析是编译器决定变量分配到栈上还是堆上的一种行为。查看逃逸分析日志:gobuild-gcflags=-m其中,-m打印出逃逸分析的优化策略。指针......
  • GC垃圾回收
    GC垃圾回收GC(GarbageCollection):垃圾回收器,用于java堆的内存管理,在JVM中程序计数器,java虚拟机栈,本地方法栈的生命周期跟随线程,栈帧的进栈和出栈能够实现自动清理,jdk8......
  • 进程相关概念、虚拟内存和物理内存映射关系
    学习地址进程和程序并发分时复用cpu单道程序设计多道程序设计cpu和mmu学习地址mmu在cpu内部虚拟内存和物理内存映射......
  • JavaScript 异步编程
    JavaScript是一种单线程语言,这意味着只有一个线程可以在同一时间执行JavaScript代码。在JavaScript中,异步编程是一种编写不阻塞代码的方式,它可以在不影响页面响应的情......
  • JavaScript 中 this 关键字的作用和如何改变其上下文
    一、this关键字的作用JavaScript中的this关键字引用了所在函数正在被调用时的对象。在不同的上下文中,this的指向会发生变化。在全局上下文中,this指向全局对象(在浏......
  • javascript: node.js
     consthttp=require("http");http.createServer(function(request,response){response.writeHead(200,{'Content-type':'text/html'});response.end('<h1>......
  • 前端面试题 - javaScript系列
    Time:2023-01-2021:14:37ES6系列1.说说var、let、const之间的区别var、let、const三者区别可以围绕下面五点展开:变量提升暂时性死区块级作用域重复声明修......
  • JVM内存划分
    JVM内存划分概述java虚拟机(JavaVirtualMachine简称JVM):是运行所有java程序的抽象计算机,是java语言的运行环境。对于java语言来说,在虚拟机的自动内存管理机制的帮助......
  • javaScript
    JavaScript是一门流行脚本快速入门跟css一样,可以直接写在html中,放在script标签中alert可以弹出弹窗,内容用单引号引入的时候一定要成对出现,不能自闭和基本语法入门......