JS查漏补缺——内存管理和垃圾回收

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来理解一下面试题常考的内存管理和垃圾回收

认识内存管理

不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们自己手动的管理内存(如:比如C、C++都是需要手动来管理内存的申请和释放的(malloc和free函数)某些编程语言会可以自动帮助我们管理内存(如:JavaScript通常情况下不需要手动管理

内存管理的生命周期

  • 申请内存
  • 使用内存
  • 释放内存

JS的内存分配

JavaScript会在定义变量时为我们分配内存
而对于变量,它有两种类型:简单数据类型(内存直接存的值),分别是Undefined,Null,Boolean,Number,String,Symbol,还有一种复杂数据类型(内存存的是引用地址):Object(对象、数组、函数)。
这两种类型在内存管理中分配内存的方式是不一样的:

  • 简单数据类型(基本类型)的值直接在栈空间进行分配,值与值之间是独立存在,修改一个变量的值不会影响其他变量的值
  • 复杂数据类型(引用类型)存在堆内存中,每创建一个对象,就会在堆内存中开辟出一个新的空间,而变量保存的对象的内存地址(对象的引用,如果两个变量保存的同一个对象,当一个变量改变属性值时,另一个变量的属性值也会变 )

简单数据类型的内存分配

// 定义变量
var a = 1;
var b = 2;

Snipaste_2022-08-18_09-46-36.png

复杂数据类型的内存分配

// 定义变量
const a = 1;
const b = 2;
const info {
  name: 'eureka',
  age: 100
}
function foo() {
  var c = 3;
  var d = 4;
  console.log(a+b);
}

Snipaste_2022-08-18_10-04-04.png

JS的内存释放

因为内存的大小是有限的,所以当内存不再需要的时候,我们需要对其进行释放,以便腾出更多的内存空间。

因为JS不用手动去释放内存,它有自己的垃圾回收机制(Garbage Collection,简称:GC),那JavaScript是怎么判断这个内存不再使用,进而被当成垃圾回收呢?

  • 当对象不再被引用时,JavaScript就认为它不再使用 (通过引用计数来确认)
  • 对象不能从根上访问到时,JavaScript也会把它认定为是垃圾 (通过标记清除来确认)

常见的GC算法——引用计数

当一个对象有一个引用指向它时,那么这个对象的引用就+1,当一个对象的引用为0时,这个对象就可以被销毁掉;

使用引用计数会有一个很严重的问题:循环引用。
循环引用指的是对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的引用,并且不能通过代码访问它们,这样它们的引用永远不会为0,垃圾回收机制不能将这两个对象释放,进而会造成内存泄露

let a = {
  name: 'a',
  dad: b
};

let b = {
 name: 'b',
 son: a
}
a = null;
b = null;

Snipaste_2022-08-18_11-45-41.png

常见的GC算法——标记清除

  • 这个算法是假定一个根对象(root object),垃圾回收器会定期从这个根开始,找所有从根开始有引用到的对象,对于哪些没有引用到的对象,就认为是不可用的对象;
  • 根对象在浏览器中是 window 对象,在 NodeJS 中是 global 对象,只有当程序退出或者关闭网页或者关闭浏览器的时候才会销毁。
  • 这个算法可以很好的解决循环引用的问题;

Snipaste_2022-08-18_12-38-19.png

参考文章:
JavaScript的内存管理 - MomentYY - 博客园

目录
相关文章
|
2月前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
193 77
|
2月前
|
监控 JavaScript
选择适合自己的Node.js内存监控工具
选择合适的内存监控工具是优化 Node.js 应用内存使用的重要一步,它可以帮助你更好地了解内存状况,及时发现问题并采取措施,提高应用的性能和稳定性。
120 76
|
2月前
|
监控 JavaScript 数据库连接
解读Node.js内存监控工具生成的报告
需要注意的是,不同的内存监控工具可能会有不同的报告格式和内容,具体的解读方法可能会有所差异。因此,在使用具体工具时,还需要参考其相关的文档和说明,以更好地理解和利用报告中的信息。通过深入解读内存监控报告,我们可以不断优化 Node.js 应用的内存使用,提高其性能和稳定性。
105 74
|
2月前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
77 31
|
1月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
46 3
|
2月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
52 3
|
2月前
|
算法 Java 开发者
Java内存管理与垃圾回收机制深度剖析####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,特别是其垃圾回收机制的工作原理、算法及实践优化策略。不同于传统的摘要概述,本文将以一个虚拟的“城市环卫系统”为比喻,生动形象地揭示Java内存管理的奥秘,旨在帮助开发者更好地理解并调优Java应用的性能。 ####
|
30天前
|
存储 监控 算法
Java内存管理的艺术:深入理解垃圾回收机制####
本文将引领读者探索Java虚拟机(JVM)中垃圾回收的奥秘,解析其背后的算法原理,通过实例揭示调优策略,旨在提升Java开发者对内存管理能力的认知,优化应用程序性能。 ####
43 0
|
8月前
|
前端开发 JavaScript 算法
JavaScript 内存管理的秘密武器:垃圾回收(下)
JavaScript 内存管理的秘密武器:垃圾回收(下)
JavaScript 内存管理的秘密武器:垃圾回收(下)
|
8月前
|
前端开发 JavaScript 算法
JavaScript 内存管理的秘密武器:垃圾回收(上)
JavaScript 内存管理的秘密武器:垃圾回收(上)
JavaScript 内存管理的秘密武器:垃圾回收(上)

热门文章

最新文章