ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

JavaScript内存泄漏setTimeout问题

2019-11-21 21:36:36  阅读:560  来源: 互联网

标签:performance memory-leaks javascript-debugger memory-management javascript


有谁知道为什么内存消耗在这里保持不变?

var count = 0;
$(init);

function init(){
    var node =  document.querySelector('.logs');

    function check(){
        var uArr = new Uint16Array(100);
        log(node, uArr.length);
        setTimeout(check,100);
    }   
    setTimeout(check,100);
}      


function log(node, text){
    if( count % 30  == 0 ){
        node.innerHTML = '';
    }
    var child = document.createElement('div');
    child.innerText = 'count ' + (count++) + " arr len "  + text;
    node.appendChild(child);
}

http://jsfiddle.net/V99Eb/11/

它应该线性增加内存分配的原因是:“ check”方法在其定义内调用自身,因此闭包变量将对内部check方法执行可用,然后再次为测试函数创建执行上下文,依此类推.

另外,在每次执行中,我们都会创建一个Uint16Array内存块,我相信它会在堆中分配,并且永远不要取消分配,因为它可以从闭包中获取.

内存配置文件:

从内存时间轴来看,随着时间的增加,内存分配似乎并没有增加.这是预期的行为吗?

解决方法:

uArr只是一个局部变量,它会在check()退出后进行分配,使用和垃圾回收.并且check()内部没有闭包. setTimeout()由check()调用(但未定义).

This page on Closures可能会有所帮助.

的确,如果有N次对check()的调用,那么将创建N个闭包(以及N个节点的副本),setTimeout()将在调用它后释放对check()的引用.因此,那里也没有泄漏.

标签:performance,memory-leaks,javascript-debugger,memory-management,javascript
来源: https://codeday.me/bug/20191121/2054722.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有