JavaScript中如何避免一些常见的内存泄漏问题

  

小编给大家分享一下JavaScript中如何避免一些常见的内存泄漏问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在本文中,主要介绍内存分配垃圾回收的工作原理以及如何避免一些常见的内存泄漏问题。

缓存( Memory)生命周期

在 JS 中,当我们创建变量、函数或任何对象时,J S引擎会为此分配内存,并在不再需要时释放它。

分配内存是在内存中保留空间的过程,而释放内存则释放空间,准备用于其他目的。

每次我们分配一个变量或创建一个函数时,该变量的存储会经历以下相同的阶段:

分配内存

  • JS 会为我们处理这个问题:它分配我们创建对象所需的内存。

使用内存

  • 使用内存是我们在代码中显式地做的事情:对内存的读写其实就是对变量的读写。

释放内存

  • 此步骤也由 JS 引擎处理,释放分配的内存后,就可以将其用于新用途。

内存管理上下文中的“对象”不仅包括JS对象,还包括函数和函数作用域。

内存堆和堆栈

现在我们知道,对于我们在 JS 中定义的所有内容,引擎都会分配内存并在不再需要内存时将其释放。

我想到的下一个问题是:这些东西将被储存在哪里?

JS 引擎在两个地方可以存储数据:内存堆堆栈。堆和堆栈是引擎是用于不同目的的两个数据结构。

堆栈:静态内存分配

JavaScript中如何避免一些常见的内存泄漏问题

堆栈是 JS 用于存储静态数据的数据结构。 静态数据是引擎在编译时能知道大小的数据。 在 JS 中,包括指向对象和函数的原始值(stringsnumberbooleanundefinednull)和引用类型。

由于引擎知道大小不会改变,因此它将为每个值分配固定数量的内存。

在执行之前立即分配内存的过程称为静态内存分配。这些值和整个堆栈的限制取决于浏览器。

堆:动态内存分配

是另一个存储数据的空间,JS 在其中存储对象函数

与堆栈不同,JS 引擎不会为这些对象分配固定数量的内存,而根据需要分配空间。这种分配内存的方式也称为动态内存分配

下面将对这两个存储的特性进行比较:

堆栈堆存放基本类型和引用
大小在编译时已知
分配固定数量的内存对象和函数
在运行时才知道大小
没怎么限制

事例

来几个事例,加强一下映像。

const person = {
  ,,名字:& # 39;约翰# 39;
  ,,年龄:24岁
  };

JS在堆中为这个对象分配内存。实际值仍然是原始值,这就是它们存储在堆栈中的原因。

const  hobbies =,(& # 39;徒步旅行# 39;,,& # 39;阅读# 39;];

数组也是对象,这就是为什么它们存储在堆中的原因。

let  name =, & # 39;约翰# 39;,,//,为字符串分配内存   const  age =, 24,,//,为字分配内存      时间=name  & # 39; John 能源部# 39;;,//,为新字符串分配内存   const  firstName =, name.slice(0, 4);,//,为新字符串分配内存

始值是不可变的,所以JS不会更改原始值,而是创建一个新值。

JavaScript中的引用

所有变量首先指向<强>堆栈强。如果是非原始值,则<代码>堆栈> 堆>

堆的内存没有按特定的方式排序,所以我们需要在堆栈中保留对其的引用。我们可以将<代码>引用视为地址,并将堆中的对象视为这些地址所属的房屋。

请记住,JS将<强>对象和<强>函数强存储在堆中。基本类型和引用存储在堆栈中。

 JavaScript中如何避免一些常见的内存泄漏问题

这张照片中,我们可以观察到如何存储不同的值。注意人

JavaScript中如何避免一些常见的内存泄漏问题