堆栈内存

作者: 晚月川 | 来源:发表于2020-03-20 23:01 被阅读0次

    JS中的内存:堆内存和栈内存

    • 堆内存是用来存储引用数据类型值的(例如:创建函数和创建对象,就像开辟一个堆内存,把代码和字符串或者键值对存储到堆内存中的)
    • 栈内存是用来执行代码和存储基本类型值的(创建的变量也存栈内存中),不仅全局代码执行(EC(G)全局执行上下文),而且函数执行(EC(X)私有上下文),最后也都会进栈执行的

    开辟的堆内存或者形成的上下文(进栈执行=>栈内存)是越多越好?还是越少越好?
    肯定是越少越好,因为计算机的内存是固定的,我们所有开辟的内存都在占用计算机的资源,当计算机内消耗存过多,性能也就越来越卡(直接导致我们的产品运行变慢) => 所以JS中一个重要的性能优化点:减少内存的使用

    • 释放堆内存
    • 释放栈内存(也就是让进栈执行的上下文,尽可能出栈释放)

    浏览器常用的垃圾回收机制(内存释放机制)

    浏览器有自动回收垃圾的机制,定期间隔某段时间,把所有没有被占用的内存回收释放(这种垃圾回收机制,比其它语言要完善一些)

    • 查找引用(webkit内核)

      • 创建一个堆(16进制地址),如果有变量或者其他东西存储了堆内存的地址,则当前堆内存被视为占用,也就不能释放销毁
      • 上下文进栈执行,如果当前上下文中的某些内容(一般也是当前上下文中创建的堆)被上下文以外的变量或者其它事务所占用,那么当前上下文就不能出栈释放(但是一般情况下,上下文中代码执行完,上下文自己就出栈释放了)
    • 内存计数器方式

      • 当前内存被其它东西引用了,则给堆计数1(累加计数),取消占用后,则减1,当减到零之后,浏览器就可以把它释放了

    如果堆内存用完后,我们想去手动释放它,则取消所有的占用:赋值为NULL(NULL是空对象指针,也就是不指向任何的堆内存)

    全局上下文只有关掉页面才会释放

    相关文章

      网友评论

        本文标题:堆栈内存

        本文链接:https://www.haomeiwen.com/subject/yegryhtx.html