我有以下更新屏幕上的元素,我似乎无法阻止它消耗内存,它每分钟消耗大约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);
我通过对浏览器进程进行抽样来从命令提示符中分析浏览器的内存使用情况。
如果我禁用此功能,那么内存不会增加并保持完全稳定!
答案 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函数的每次迭代时):
#clock
元素,jQuery每次都必须访问DOM ch
,cs
和cs
会在每个TimeTock
的末尾被销毁,然后进行垃圾回收。修改后的代码:
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);