# 1、执行环境栈

  浏览器会提供一个供代码运行的环境 栈内存 ECStack(Execution Context Stack),是计算机在计算机中分配出来的一块内存。js代码在执行过程中会按照以下顺序执行。

  • 执行环境栈 ECStack
  • 全局执行上下文EC(G)
  • 全局变量对象 VO(G)
  • 变量对象 VO
  • 活动对象 AO

基本数据类型赋值的详细过程 var a=12

  • 创建一个值12,把它存储起来(基本类型值存在栈内存中)
  • 声明一个变量(var a),把它存储在当前上下文所属的变量对象中。
  • 最后进行等号赋值(定义)。本质是一个指针指向的过程。

引用数据类型赋值的详细过程。var a={}

  • 在计算机中开辟一个堆内存,用来存储自己的键值对,每一个堆内存都有一个16进制的地址。
  • 在堆内存中分别存储键值对。
  • 将16进制的地址放到栈中,供变量调用。

# 2、GC 浏览器垃圾回收机制 (内存释放机制)

# 1、栈内存:EC

  • 全局执行上下文:在浏览器加载页面的时候形成,然后在页面关闭的时候释放。(页面刷新:先释放,重新加载后形成)
  • 私有上下文:函数执行会形成一个私有的上下文(let/const 也会产生私有的上下文)
    • 一般情况下代码执行完就会被出栈释放
    • 如果当前上下文中的某个内容(一般是一个堆)被上下文以外的事物占用了,则当前上下文不能释放。

# 2、堆内存 :HEAP

  • 谷歌浏览器按照是否被引用 来决定堆内存的释放还是不释放的:浏览器回定期间隔一段时间,查找所有堆内存是否被占用,被占用的不处理,但是如果被占用,则直接把它释放掉。(引用计数)。我们可以手动赋值为null 的方式,来释放内存。

  • IE浏览器时根据引用计数的方式来实现垃圾回收的:每次被占用都会计数累加,相反取消引用,则计数递减。直到计数为0,则释放内存。但是这种方式会出现急着记着就会乱的情况,然后出现 内存泄漏

Last Updated: 10/9/2020, 10:20:41 AM