js内存的数据存储与回收

3 篇文章 0 订阅

内存的数据存储

栈:后进先出

值类型变量:栈里存储的是 变量的key以及对应的value

方法、对象、数组等引用类型:栈里面存的 变量的key以及对应的存放数据的内存地址。

V8内存的管理

V8引擎:执行js的引擎。

V8大小:64位下是1.4G,32位下是700M,不同浏览器,不一样。

1.4G对于浏览器脚本来说完全够用

js的执行是阻塞式的,代码回收没结束不会向下继续执行,(回收2G,会阻塞2s

所以设计1.4G,就可以就不会因为代码回收而阻塞太久。

新生代和老生代空间

新生代:

特点:内存较小,64位下约32M,短时间存活的新变量。

回收算法:复制-清空(牺牲空间换时间)。

               a中存储的东西,a中还存活的东西复制到b中,

                清空a中的东西,然后a和b互换。

                重复以上步骤。

新生代和老生代如何转化:

        1、新生代发现本次复制后,会占用超过25%的b空间

        2、这个对象量已经经历过一次回收。

老生代:

特点:64位下约1.4G,生存时间较长的变量会转到老生代里面(经过几次回收都没有被回收)。

回收算法:

        1、标记已死变量

        2、清除已死变量

        3、整理磁盘(例如:数组存储必须是连续的内存空间,当清除的已死变量为不连续的空间,本来内存可以存储一个长度为2的数组,但是因为不连续,所以存储不了。所以,整理磁盘,把后面的变量依次往前提,就空出两个连续的空间了)

怎么判定一个变量可以回收

1、全局变量,直到程序结束才会回收

2、普通变量,当它们不被引用的时候(闭包就容易产生内存溢出,因为一直被引用,内存一直不释放)

什么时候触发回收

1、执行完一次代码

2、内存不够的时候

内存优化

浏览器端:

查看内存:window.performance

node:

查看内存:process.memoryUsage()

可以手动触发垃圾回收 - global.gc

可以设置内存: node --max-old-space-size=要设置的老生代内存大小  要执行的代码文件

优化建议:

1、 进来不要定义全局变量,定义了也要及时手动回收(例如:让这个变量的值等于undefined、null)。

2、注意闭包,对闭包进行限制,不能无限制的增长,(例如:当闭包里的数组进行push数据,超过一定长度,删除一些,再继续push)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值