系统相关
首页 > 系统相关> > JavaScript的内存管理

JavaScript的内存管理

作者:互联网

JavaScript的内存管理

1.什么是内存管理?

在了解JavaScript的内存管理之前,可以先大致熟悉一下什么是内存管理,不管什么样的编程语言,在其代码执行的过程中都是需要为其分配内存的。

不管什么样的编程语言,以及它用什么方式来管理内存,其内存的管理都具备以下的生命周期

但是不同的编程语言对内存的申请和释放会有不同的实现,主要分为手动和自动管理内存

2.JavaScript的内存分配

通过上面对内存管理的简单介绍可以知道,JavaScript是自动管理内存的,所以在我们编写JS代码定义变量时就会为其分配内存。

根据JavaScript不同的数据类型,会对其分配到不同的内存空间中,数据类型主要分为基本数据类型复杂数据类型

以下代码在内存结构中的表现形式如下:

const name = 'curry'
const age = 30
const info = {
  name: 'kobe',
  age: 24
}

3.JavaScript的垃圾回收机制

在管理内存的生命周期中是包括内存的释放,因为我们的内存大小是有限的,所以当代码执行完毕,不再需要内存的时候,那么就需要对其进行内存释放,以便腾出更多的内存空间给其它的应用程序使用。

4.两种常见的GC算法

4.1.引用计数

什么是引用计数?

当一个对象有一个引用指向它时,那么这个对象的引用就加1,并且将其引用次数保存起来,而当一个对象的引用为0时,那么这个对象就可以被销毁了(回收)。

示例代码:

let person1 = { name: 'curry' }

let person2 = {
  name: 'kobe',
  friend: person1
}

let person3 = {
  name: 'klay',
  friend: person1
}

内存表现:

如果接着执行person3 = null,那么person3的引用指向次数就会减1,变为0,从而销毁。而person3销毁后person1也会失去person3的指向,引用指向次数也会减1,变为2。

缺点:但是引用计数这个GC算法,存在一个很大的弊端,就是当出现循环引用时,就无法进行正确的回收,导致内存泄露,如下示例代码:

let person1 = {
  name: 'curry',
  friend: person2
}

let person2 = {
  name: 'klay',
  friend: person1
}

内存表现:

4.2.标记清除

什么是标记清除?

这个算法设置了一个根对象(root object),GC会定期从这个根对象开始往下查找有引用到的对象,而对于那些没有引用到的对象,也就是没有查找到的对象,就认为是需要进行回收的对象。

标记清除的一大优势就是可以很好的解决循环引用的问题,如下图:

标签:管理,JavaScript,回收,person1,GC,引用,内存
来源: https://www.cnblogs.com/MomentYY/p/15869941.html