js中定义得变量,对象,函数,等都会占用内存,常见类型占用内存如下:
bealoon占用4个bytes
string占用2个bytes
number因为是64位标识符所以为8bytes
null不会占用内存
特别指出:object得key值也会占用内存
浏览器内存周期分为:
- 内存分配
- 内存使用
- 内存释放
js内存回收机制:
1.引用计数:
语言引擎有一张"引用表",保存了内存里面所有资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。
缺点:循环引用得情况下,内存不会释放。例:a ->b, b->a,检查时都显示ab被引用
2.标记清除:
当变量进入环境时,例如,在一个函数中声明一个变量,就将这个变量标记为"进入环境",从逻辑上讲,永远不能释放进入环境变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为"离开环境"。
垃圾回收机制在运行的时候会给存储再内存中的所有变量都加上标记(可以是任何标记方式),然后,它会去掉处在环境中的变量及被环境中的变量引用的变量标记(闭包)。而在此之后剩下的带有标记的变量被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后垃圾回收机制到下一个周期运行时,将释放这些变量的内存,回收它们所占用的空间。
内存泄漏
1. 全局变量
2.闭包
3.dom引用
4.定时器
如果避免内存泄露的话,需要在此基础上进行反向操作,及时清理一些定时器,全局变量,少用闭包