jQuery屏幕上的时钟内存泄漏

时间:2013-09-06 04:59:49

标签: jquery

我有以下更新屏幕上的元素,我似乎无法阻止它消耗内存,它每分钟消耗大约0.10%或ram。

我已经尝试将所有变量都置空,但我似乎没有做任何事情会阻止这种泄漏。

function TimeTick(){
    var lt = new Date(); 
    lt.setMilliseconds(lt.getMilliseconds()-g_svros);
    var ch=lt.getHours(), cm=lt.getMinutes(), cs=lt.getSeconds(); 
    if(ch==0) ch=12; 
    $('#clock').val((ch >12?ch-12:ch)+":"+(cm<10?"0":"")+cm+":"+(cs<10?"0":"")+cs+" "+(ch>=12?"PM":"AM"));
    lt=null;ch=null;cm=null;cs=null;
}
var tick = setInterval('TimeTick()',250);

我通过对浏览器进程进行抽样来从命令提示符中分析浏览器的内存使用情况。

如果我禁用此功能,那么内存不会增加并保持完全稳定!

3 个答案:

答案 0 :(得分:0)

'TimeTick()'每250毫秒进行一次评估。

看看这是否有所作为:

var tick = setInterval(function () {
    TimeTick();
}, 250);

请参阅eval基准here

答案 1 :(得分:0)

这是一个删除eval和函数声明的小提琴,并将jquery选择器移到函数外部:http://jsfiddle.net/aBvdy/1/

$(function() {
    var g_svros = 0;
    var clock = $('#clock');
    var tick = setInterval(function() {
        var lt = new Date(); 
        lt.setMilliseconds(lt.getMilliseconds()-g_svros);
        var ch=lt.getHours(), cm=lt.getMinutes(), cs=lt.getSeconds(); 
        if(ch==0) ch=12; 
        clock.val((ch >12?ch-12:ch)+":"+(cm<10?"0":"")+cm+":"+(cs<10?"0":"")+cs+" "+(ch>=12?"PM":"AM"));
    }, 250);
});

我看了Chrome流程管理器大约5分钟,该标签的内存使用量只有非常小的波动。没什么好称之为的。

答案 2 :(得分:0)

让我们做一些优化(当我说每次我的意思是TimeTick函数的每次迭代时):

  1. 每次停止创建新的日期对象,因为它是公平的costly(如果你想阻塞浏览器,它会很有用!)没关系,你需要这样做才能得到新的每次约会。
  2. 每次都不要重新选择#clock元素,jQuery每次都必须访问DOM
  3. 使用匿名函数而不是eval,因为eval需要更多overhead(解析等)
  4. 删除变量的归零,它们实现了什么?由于JS具有函数范围,chcscs会在每个TimeTock的末尾被销毁,然后进行垃圾回收。
  5. 修改后的代码:

    function TimeTick(lt, clock) {
         lt.setMilliseconds(lt.getMilliseconds()-g_svros);
         var ch= lt.getHours(), cm=lt.getMinutes(), cs=lt.getSeconds(); 
         if(ch==0) ch=12; 
         clock.val((ch >12?ch-12:ch)+":"+(cm<10?"0":"")+cm+":"+(cs<10?"0":"")+cs+" "+(ch>=12?"PM":"AM"));
    }
    
    var clock = $('#clock'); //Optimization 2
    var tick = setInterval(function() {
        TimeTick(new Date(), clock); //Optimization 3
    }, 250);