https://www.bilibili.com/video/BV1iZ4y1r7no
JS内存真解
内存数据结构
内存: 访问速度快, 容量小, 临时存在
硬盘: 访问速度慢, 容量大,持久存在
app下载按照 : 硬盘
app运行:内存
函数声明 -> 函数体 : 会占用内存空间, 在app运行期间持久存在
执行函数 -> 执行上下文 :会占用内存空间, 临时占用内存空间
分配一段内存空间: 地址是连续的
常见的一个常识:
基础数据类型 -> 存放在栈
引用数据类型 -> 存放在堆
这里与讲的不符合,因为 栈存放的是函数的执行上下文, 怎么会是存放基础数据类型呢? 堆内存存放 引用类型数据, 存放 是对象的 地址值 还是 对象本身呢
栈内存:管理函数执行 call Stack -> 函数的执行顺序
堆内存:存储对象, 函数声明 ,变量, 引用类型,非引用类型
内存溢出: 大多数都是栈溢出,因为内存分配的空间为 100 , 但是 调用的函数 可能是死循环,就会出现栈溢出
内存泄漏: 在分配的一段内存空间中, 堆内存 对(变量,对象…), 管理不到,访问不 这个内存中的某个变量, 这个变量确切存在在这段内存中,垃圾机制不认识它, 无法回收,这就是内存泄漏
问题的扩展: 对webpack的 tree shaking (树摇)
- 当对网上的公开库的使用时,库可能提供很多的工具函数,然而在项目中只使用了一个函数; 这就导致堆内存占用了很大的空间。
- 在编译运行项目时,可以使用 webpack 的 插件 tree shaking 对一些没有使用的方法,函数,进行去除; 避免堆内存的占用
- 分析 tree sharking 插件的工作原理
JS内存回收小案例
var a = {n: 1, m: 2}
var a = null; // 标记 {xxx} 这个对象为垃圾的状态(未使用)
// {n: 1, m: 2} 这个引用类型的对象 怎么被垃圾回收机制 回收
{n: 1, m: 2} 这个引用类型的对象 怎么被垃圾回收机制 回收
{n: 1, m: 2} 会存在内存等着被回收 , 而不是马上被回收
JS垃圾回收机制的工作原理: JS垃圾回收机制会周期性的 循环,遍历的内存空间, 发现有垃圾,就回收,清理内存