JS垃圾回收

JS垃圾回收

基本思路:确定那个变量不会再使用,然后释放其所占内存,这个过程是周期性的,即垃圾回收程序每隔一段时间(或者说在代码执行过程中某个预定的收集时间)就会自动运行

  • 缺点:垃圾回收的过程中,因为某块内存是否还有用,不可判定

栗子:

函数中的局部变量会在函数执行时存在,此时,栈(或堆)内存会分配空间以保存相应的值
函数在内部使用了变量,然后退出,此时就不再需要哪个局部变量了,他占用的内容就会被释放,供后面变量使用
这种情况下显然不再需要局部变量了,但并不是所有的时候都会这么明显,这个局部变量不再需要使用

两种标记方法

垃圾回收程序必须跟踪记录那个变量还会使用,以及那个变量不需要再使用,以便回收内存.

1)标记清理 (常用)

当变量进入执行上下文时,就会被执行上下文的文本环境记录(此时,加上存在于执行上下文的标记),当变量离开执行上下文时也会被加上离开执行上下文的标记

标记的方法有很多


image-20210928191438132.png

2)引用计数

思路:每个值都被记录他引用的次数,当这个值声明变量时并给他赋予一个引用值,如果同一个值又被赋予另一个变量时,引用值++,反之这个值引用的变量被其他值覆盖时,引用值--,当其引用值为 0 时 释放该值所占的内存 以供其他人使用(这个内存RAM => 运行内存)

var num = 1
// 内存中会有一个 1 的值 并且其 引用值 n = 1
var nums = 1
// 此时 内存 中的 1 的 引用值++ => n++ = 2
num = 2
// 此时 内存 中的 1 的 引用值-- => n-- = 1 而 2 的引用值 s = 1
nums = 2 
// 此时 内存 中的 1 的 引用值-- => n-- = 0 而 2 的引用值 s++ = 1
// 故 此时 值:1 所占用的内存 将被释放

在NetScape 4.0 版本时 JavaScript就放弃了 引用计数 转而 使用 标记清理 因为函数中的Object 的 引用值 永远不会为 0 导致内存占用无法被释放 从而导致 性能降低

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 垃圾回收制度主要是通过标记清理和引用技术的方式进行管理1.标记清理:当变量进入上下文的时候,,比如在函数中声明一个...
    Viewwei阅读 166评论 0 0
  • 在 JS 中 值类型数据存储在 栈空间中,引用类型的数据存储在堆空间中。有些数据被使用之后,就不需要了,我们需...
    _1633_阅读 355评论 0 1
  • 使用JavaScript进行前端开发时几乎完全不需要关心内存管理问题,对于前端编程来说,V8限制的内存几乎不会出现...
    写Blog不取名阅读 10,972评论 9 20
  • 和C#、Java一样JavaScript有自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在...
    fortunatelys阅读 343评论 0 1
  • 一、垃圾回收简述 JS 是使用垃圾回收的语言,简单来说就是执行环境负责在代码执行时管理内存。基本思路很简单:确定哪...
    前端_Fn阅读 582评论 0 0