Skip to content

Latest commit

 

History

History
105 lines (29 loc) · 2.08 KB

js.内存.md

File metadata and controls

105 lines (29 loc) · 2.08 KB

Js 中的变量在内存中的储存形式是什么样的?

http://www.ruanyifeng.com/blog/2017/04/memory-leak.html

参考:https://juejin.im/post/5b10ba336fb9a01e66164346

内存模型:

JS内存空间分为栈(stack)、堆(heap)、池(一般也会归类为栈中)。 其中栈存放变量,堆存放复杂对象的值,池存放常量。

内存的生命周期

  1. 内存分配:当我们申明变量、函数、对象的时候,系统会自动为他 们分配内存
  2. 内存使用:即读写内存,也就是使用变量、函数等
  3. 内存回收:使用完毕,由垃圾回收机制自动回收不再使用的内存

var a = 20; // 在内存中给数值变量分配空间

alert(a + 100); // 使用内存

var a = null; // 使用完毕之后,释放内存空间

JS 的内存回收有两种:引用计数垃圾回收、标记清除法

引用计数回收:简单的讲就是没有引用指向该对象,则该对象就会被垃圾回收机制回收

缺点:遇到有循环引用的情况是,则不会被回收,造成内存泄漏

标记清除:

这个算法假定设置一个叫做根 root 的对象(在Javascript里,根是全局对象). 定期的, 垃圾回收器将从根开始, 找所有从根开始引用的对象, 然后找这些对象引用的对象, 从根开始,垃圾回收器将找到所有可以获得的对象和所有不能获得的对象.

从2012年起, 所有现代浏览器都使用了标记-清除内存回收算法. 所有对JavaScript垃圾回收算法的改进都是基于标记-清除算法的改进.

什么是内存泄露?

本质上讲, 内存泄露就是不再被需要的内存, 由于某种原因, 无法被释放.

常见的内存泄漏:

1、全局变量

2、未销毁的定时器和回调函数

3、闭包

4、DOM 引用

Written with StackEdit.