JS中的内存:堆内存和栈内存
- 堆内存是用来存储引用数据类型值的(例如:创建函数和创建对象,就像开辟一个堆内存,把代码和字符串或者键值对存储到堆内存中的)
- 栈内存是用来执行代码和存储基本类型值的(创建的变量也存栈内存中),不仅全局代码执行(EC(G)全局执行上下文),而且函数执行(EC(X)私有上下文),最后也都会进栈执行的
开辟的堆内存或者形成的上下文(进栈执行=>栈内存)是越多越好?还是越少越好?
肯定是越少越好,因为计算机的内存是固定的,我们所有开辟的内存都在占用计算机的资源,当计算机内消耗存过多,性能也就越来越卡(直接导致我们的产品运行变慢) => 所以JS中一个重要的性能优化点:减少内存的使用
- 释放堆内存
- 释放栈内存(也就是让进栈执行的上下文,尽可能出栈释放)
浏览器常用的垃圾回收机制(内存释放机制)
浏览器有自动回收垃圾的机制,定期间隔某段时间,把所有没有被占用的内存回收释放(这种垃圾回收机制,比其它语言要完善一些)
-
查找引用(webkit内核)
- 创建一个堆(16进制地址),如果有变量或者其他东西存储了堆内存的地址,则当前堆内存被视为占用,也就不能释放销毁
- 上下文进栈执行,如果当前上下文中的某些内容(一般也是当前上下文中创建的堆)被上下文以外的变量或者其它事务所占用,那么当前上下文就不能出栈释放(但是一般情况下,上下文中代码执行完,上下文自己就出栈释放了)
-
内存计数器方式
- 当前内存被其它东西引用了,则给堆计数1(累加计数),取消占用后,则减1,当减到零之后,浏览器就可以把它释放了
如果堆内存用完后,我们想去手动释放它,则取消所有的占用:赋值为NULL(NULL是空对象指针,也就是不指向任何的堆内存)
全局上下文只有关掉页面才会释放
网友评论