1. 什么是内存溢出
内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,就出抛出内存溢出的错误。
var obj = {}
for (var i = 0; i < 100000; i++) {
obj[i] = new Array(10000000)
}
console.log('------')
2. 什么是内存泄漏
内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费,当内存溢出情况积累多了容易造成内存溢出现象。
3.js的垃圾回收机制
垃圾回收机制就是为了防止出现过多的内存泄漏情况,内存泄漏简单的说就是当我们已经不在使用某块内存中所存储的内容了,但是这块内存依然被这个内容所占用,这个内容被称为垃圾。而垃圾回收机制的用处就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。JS有两种变量,全局变量和局部变量。局部变量的在函数执行过后,便可将它引用的内存释放(即垃圾回收),但全局变量会持续到浏览器关闭页面才释放其内存。
JS执行环境中的垃圾回收器检测哪块内存可以被回收有两种方式:标记清除(mark and sweep)、引用计数(reference counting)。
在js中最常用的垃圾回收机制就是标记清除。标记清除的过程:当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包)。而在此之后仍有标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。即被删除的变量时不在环境中且不被环境中变量引用的变量。
4. 在js中内存泄漏的几种情况
- BOM / DOM对象泄漏
- scipt中存在对BOM / DOM对象的引用
- javaScript对象泄漏
- 闭包函数导致的泄漏