tangyuxian
文章77
标签36
分类5
js-栈溢出与内存溢出小总结

js-栈溢出与内存溢出小总结

总结栈溢出和内存溢出两种情况

一 栈溢出

    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:一个数字,表示多个分离的上下文或已分离但尚未进行垃圾回收的上下文。如果内存泄漏值为非零值,则可能表明该错误。
本文作者:tangyuxian
本文链接:https://www.tangyuxian.com/2022/05/31/%E5%89%8D%E7%AB%AF/JavaScript/js-%E6%A0%88%E6%BA%A2%E5%87%BA%E4%B8%8E%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA%E5%B0%8F%E6%80%BB%E7%BB%93/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可