总结栈溢出和内存溢出两种情况
一 栈溢出
var a = 1;
function test(){
console.log(a++)
test()
}
test()
在谷歌浏览器当中计数达到10470左右,会出现Uncaught RangeError: Maximum call stack size exceeded
错误,不同系统不同浏览器计数上限可能有所不同,但都会有一个上限值
调用栈是有大小限制,当入栈执行的上下文超过一定数目便会出现栈溢出
js
代码执行过程中会创建全局上下文,遇到函数会取出函数代码进行编译并创建函数执行的上下文,也就是产生了新的调用栈,不断执行上下文压入栈,代码执行完毕会出栈
上述示例中,函数不断递归调用本身,会不断入栈生成新的调用栈,却一直不出栈,达到栈帧上限便会栈溢出
二 内存溢出
var obj = {}
for(var i = 0; i < 100000000000; i++){
obj[i] = new Array(100000000000)
}
程序目前需要的内存大于环境目前所能提供的内存,从而导致程序抛出内存溢出的错误信息
如果在node环境下出现内存溢出情况,可适当的调整当前内存上限,通过require('v8').getHeapStatistics()
查看目前内存情况,具体返回参数情况可参照官方文档
{
total_heap_size: 6090752,
total_heap_size_executable: 573440,
total_physical_size: 6090752,
total_available_size: 4340763536,
used_heap_size: 4169232,
heap_size_limit: 4345298944,
malloced_memory: 8192,
peak_malloced_memory: 712992,
does_zap_garbage: 0,
number_of_native_contexts: 2,
number_of_detached_contexts: 0
}
- total_heap_size:一个数字,表示总堆大小。
- total_heap_size_executable:一个数字,表示可执行堆的总大小。
- total_physical_size:一个数字,表示总的物理尺寸。
- total_available_size:一个数字,表示总可用大小。
- used_heap_size:一个数字,表示已用堆大小。
- heap_size_limit:一个数字,表示堆大小限制。
- malloced_memory:一个数字,表示已分配的内存。
- peak_malloced_memory:一个数字,表示最大分配的内存。
- does_zap_garbage:一个数字,特别是一个布尔值,表示-zap_code_space选项是否已启用。
- number_of_native_contexts:数字,表示许多本机上下文或当前活动的顶级上下文。内存泄漏可能通过测量该数字随时间的增量来指示。
- number_of_detached_contexts:一个数字,表示多个分离的上下文或已分离但尚未进行垃圾回收的上下文。如果内存泄漏值为非零值,则可能表明该错误。