JavaScript的内存管理

1.什么是内存管理?

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

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

  • 申请内存:分配其需要的内存。
  • 使用内存:使用分配的内存。
  • 释放内存:使用完毕后,对其进行释放。

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

  • 手动管理内存:像C、C++等一些接近底层的编程语言,都是需要手动来申请和释放内存(malloc函数用于申请内存、free函数用于释放内存)。
  • 自动管理内存:像Java、JavaScript、Python等一些高级编程语言,都是自动帮助我们管理内存的。

2.JavaScript的内存分配

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

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

  • 对于基本数据类型的内存分配会在执行时,直接在栈空间中进行分配。

    • 基本数据类型(也称值类型):string、number、boolean、undefined、null、symbol;
  • 对于复杂数据类型的内存分配会在堆内存中开辟一块空间,变量引用其内存地址
    • 复杂数据类型(也称引用类型):object、function、array;

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

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

3.JavaScript的垃圾回收机制

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

  • 而在手动管理内存的编程语言中,需要自己通过一些方式来释放不再需要的内存,这样就需要编写专门用于管理内存的代码,不仅影响编写代码的效率,管理不当也有可能产生内存泄露
  • 所以大部分现代的编程语言都是有自己的垃圾回收机制的,那么什么是垃圾回收机制?
    • 垃圾回收(Garbage Collection,简称GC),就是对于那些不再使用的数据,都可以称之为垃圾,需要通过回收来释放内存空间;
    • 在JavaScript的运行环境JS引擎中就存在垃圾回收的功能模块,这个功能模块就称为垃圾回收器
  • 那么这里就可以提出一个疑问,GC是如何找到不再使用的数据,并对其进行内存回收呢?
    • 这里就用到了GC算法,下面介绍两种常见的GC算法

4.两种常见的GC算法

4.1.引用计数

什么是引用计数?

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

示例代码:

  • person1的引用次数为3;
  • person2和person3的引用次为1;
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算法,存在一个很大的弊端,就是当出现循环引用时,就无法进行正确的回收,导致内存泄露,如下示例代码:

  • curry的好朋友是klay,巧合的是klay的好朋友是curry,这样就出现了对象的循环引用;
let person1 = {
name: 'curry',
friend: person2
} let person2 = {
name: 'klay',
friend: person1
}

内存表现:

  • 即使执行person1 = null; person2 = null,person1和person2对象的引用次数依然为1;
  • 所以引用计数就无法很好的处理这种情况了;

4.2.标记清除

什么是标记清除?

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

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

  • 标记清除算法首先会从root object往下开始查找引用到的对象;
  • 而对于object6和object7进行了循环引用了的对象,是查找不到的,就会被视为回收对象,从而被GC回收;
  • 目前的JS引擎的GC核心采用的比较多的算法就是标记清除,类似于V8引擎不单单只是用了标记清除,同时也结合了一些其它的算法来应对更多的情况;

JavaScript的内存管理的更多相关文章

  1. JavaScript 之垃圾回收和内存管理

    JavaScript 具有自动垃圾收集机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存.而在 C 和 C++ 之类的语言中,开发人员的一项基本 ...

  2. 《JavaScript 闯关记》之垃圾回收和内存管理

    JavaScript 具有自动垃圾收集机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存.而在 C 和 C++ 之类的语言中,开发人员的一项基本 ...

  3. javascript 变量,作用域,内存管理小结

    js的变量保存两种类型的数据——基本数据类型与引用类型.具有以下几点特征:   变量: 1)基本类型值在内存中占固定大小的空间,因此被保存在栈内存中; 2) 把保存基本类型值得变量赋给另一个变量,会创 ...

  4. 160930、Javascript的垃圾回收机制与内存管理

    一.垃圾回收机制-GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性 ...

  5. 如何避免JavaScript的内存泄露及内存管理技巧

    发表于谷歌WebPerf(伦敦WebPerf集团),​​2014年8月26日. 高效的JavaScript Web应用必须流畅,快速.与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果 ...

  6. [原创作品]Javascript内存管理机制

    如果你也喜欢分享,欢迎加入我们:QQ group:164858883 内存策略:堆内存和栈内存栈内存:在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个 ...

  7. javascript中的内存管理和垃圾回收

    前面的话 不管什么程序语言,内存生命周期基本是一致的:首先,分配需要的内存:然后,使用分配到的内存:最后,释放其内存.而对于第三个步骤,何时释放内存及释放哪些变量的内存,则需要使用垃圾回收机制.本文将 ...

  8. 深入学习javaScript闭包(闭包的原理,闭包的作用,闭包与内存管理)

    前言 虽然JavaScript是一门完整的面向对象的编程语言,但这门语言同时也拥有许多函数式语言的特性. 函数式语言的鼻祖是LISP,JavaScript在设计之初参考了LISP两大方言之一的Sche ...

  9. JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏

    摘要: 作者将自己常用的JavaScript模块分享给大家. 原文:JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏 作者:前端小智 Fundebug经授权转载,版权归原作者所有. ...

随机推荐

  1. Improving Adversarial Robustness via Channel-Wise Activation Suppressing

    目录 概 主要内容 代码 Bai Y., Zeng Y., Jiang Y., Xia S., Ma X., Wang Y. Improving adversarial robustness via ...

  2. X86系统或intel RK主板上EDP转LVDS屏转接板|CS5211DP转LVDS设计

    众所周知LVDS接口是美国NS美国国家半导体公司为克服以TTL电平方式传输宽带高码率数据时功耗大,电磁干扰大等缺点而研制的一种数字视频信号传输方式.由于其采用低压和低电流驱动方式,实现了低噪声和低功耗 ...

  3. <数据结构>关键路径

    目录 AOV网和AOE网 AOV网 AOE网 定义 与AOV网的转化 AOE网中着重解决的两个问题 1.最长路径问题 2.关键活动问题 总结 最长路径 无正环的图 有向无环图的最短路径 其他情况 关键 ...

  4. 编写Java程序_银行终端服务系统

    目录 一.General description 总体概述 二.About the Project 项目介绍 三.Soft function 软件功能 四.UI Model Use Case Diag ...

  5. 物联网大赛 - Android学习笔记(一) Android概念

    一.Android 概念 Android是开放式的手机和电脑操作系统,是基于Linux系统做的上层开发. android可以做些什么? Android可以开发各种手机应用APP,也可以开发车载系统等, ...

  6. JAX-MD在近邻表的计算中,使用了什么奇技淫巧?(一)

    技术背景 JAX-MD是一款基于JAX的纯Python高性能分子动力学模拟软件,应该说在纯Python的软件中很难超越其性能.当然,比一部分直接基于CUDA的分子动力学模拟软件性能还是有些差距.而在计 ...

  7. 怎样在idea添加log日志 以及log4j2配置文件解读

    网上找了很多篇文章,就数这篇比较全,从下载到配置都有讲到,解决从0开始接触java日志文件添加的各位同学.参考文章:https://www.cnblogs.com/hong-fithing/p/769 ...

  8. Chrome - XPath Helper插件 使用手工拖拽方式无法正常安装的解决办法

    安装前准备: (1)下载 XPath Helper资源: 链接: https://pan.baidu.com/s/1yEnngIJz8fT9fNv3aHhs7w 提取码: afy3 (2)Chrome ...

  9. sqlcl - Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file

    运行sqlcl的命令sql出错 bash-4.2$ sql username/password@hostname:1521:databasename Exception in thread " ...

  10. HTML5基本结构和语法

    1.1HTML5文档基本结构 HTML5文档省略了<html>,<head>,<body>等元素,使用HTML5的DOCTYRE声明文档类型,简化<meta& ...