为什么要关注内存
“页面无响应”内存占太多,太卡
- 防止页面占用内存过大,引起客户端卡顿,甚至无响应;
- Node使用的也是V8,内存对于后端服务的性能至关重要。因为服务的持久性,后端更容易造成内存溢出,内存超出,服务就宕掉了;
V8引擎内存回收机制
- 新生代内存空间
- From
- To
- 老生代内存空间
V8引擎内存有多大
- 总大小:操作系统64位 1.4G,32位0.7G
- 新生代:操作系统64位 64MB,32位16MB
- 老生代:操作系统16位 1400MB,32位700MB
为什么不占用更多的计算机内存
- js设计支出是为浏览器设计,前端特点-不持久化,js代码执行一遍后,不用的就全部回收了。
- js回收内存时会暂停代码执行;js回收100MB垃圾,需要6ms。如果过大,则回收的内容也多,将会非常耗时。
到底怎么回收
- 新生代简单的说就是复制,存放新产生的变量。首先存放在From空间,满足一定条件后,将还活着的变量复制到To中。然后清空From空间(全部清空节省时间)。往后,To变为From,之前清空的From变成新的To)。牺牲空间换时间。牺牲一半空间,总有一半空间是空的。
- 老生代:标记、删除、整理
- 新生代占用超过25%就转为老生代
- 标记:先标记死掉的变量
- 删除标记过的变量
- 整理空间(同理于电脑磁盘碎片整理)让内存连续起来(数组在内存中存储必须是连续空间,所以必须要整理)
新生代怎么变成老生代
- 定义一个变量,全都在新生代From空间 ==》变量是否被回收过 ==》yes 进入老生带 ==》 no 进入新生代To空间
- 定义一个变量,全都在新生代From空间 ==》 To空间是否已经使用过25%() ==》 yes 进入老生带 == 》 进入新生代To空间
V8引擎如何处理内存?(即如何处理变量)
windoe.performance // 查看内存使用情况
Node- process.memoryUsage()
容易引发内存使用不当的情景
- 滥用全局变量
- 缓存不限制
- 操作大文件