【问题标题】:Why does my digital clock function leak memory?为什么我的数字时钟功能会泄漏内存?
【发布时间】:2015-05-20 12:39:59
【问题描述】:

我有一个数字时钟函数,它从 JSON 结果中获取小时、分钟和秒,将它们解析为整数,对它们进行数学运算(每次循环时将秒加 1,如果秒为 0,添加 1 到分钟等)。在数学之后,我将这三个变量解析为字符串,然后我可以用前导 0 填充它们以获得看起来像

的结果

10:05:34 (小时、分钟、秒)。

我使用这种方法而不是datetimes,因为JS总是会解析本地时间的datetimes,但是这三个变量是基于服务器时间的。

function countTime(){
        timeSeconds = parseInt(timeSeconds);
        timeMinutes = parseInt(timeMinutes);
        timeHours = parseInt(timeHours);

        timeSeconds = (timeSeconds + 1);
        if (timeSeconds == 60){timeMinutes = (timeMinutes + 1); timeSeconds = 0;};
        if (timeMinutes == 60){timeHours = (timeHours + 1); timeMinutes = 0;};

        //convert from 24 to 12 hour time, and "0" hour to 12
        if (timeHours > 12){
            timeHours = (timeHours - 12)
        };
        if (timeHours == 0){
            timeHours = 12;
        };

        //back to strings so that 0s can be padded
        timeSeconds = timeSeconds.toString();
        timeMinutes = timeMinutes.toString();
        timeHours = timeHours.toString();

        //pad 0s
        if (timeSeconds <= 10 && timeSeconds.length < 2)(timeSeconds = ("0" + timeSeconds));
        if (timeMinutes <= 10 && timeMinutes.length < 2)(timeMinutes = ("0" + timeMinutes));
        if (timeHours <= 10 && timeHours.length < 2)(timeHours = ("0" + timeHours));

        //show time
        timetext = timeHours + ":" + timeMinutes + ":" + timeSeconds
        $('#BT').html(timetext);
    };

这个函数调用它,设置它的间隔:

function updateTime() {
    countTime();
    timeInt = setInterval(countTime,1000);
    console.log('updated time from server');
};

timeInt 之前已全局初始化,因此我可以在窗口焦点事件上清除该间隔。 当我把这个函数从我的页面中取出时,我有大约 20kb 的内存使用量,这是相当确定的。包含此功能后,内存使用量从大约 40kb 开始并每秒增加(我认为这表明内存泄漏......)。 updateTime 以非标准间隔调用(大约每 45 分钟由 AJAX 调用的成功回调获得 timeHours、timeMinutes 和 timeSeconds。我有范围问题吗?我是否在何时不必要地重新定义变量我有countTime 的间隔?

【问题讨论】:

  • 你只需要调用一次 setInterval() 来启动你的时钟。如果您多次调用它,那么您将运行多个计时器。或者,您可以使用 setTimeout 运行一次并停止。内存泄漏通常是由circular references 引起的。 Chrome 有一个object allocation tracker,这将有助于识别问题......如果有的话。
  • 我也遇到了这个问题。每秒 js 堆上升,几分钟后下降。但它并没有下降到起始值,而是略高于起始值,所以我们得到了一种缓慢增加的回归曲线......

标签: javascript jquery performance memory-leaks


【解决方案1】:

您正在泄漏间隔计时器。您需要在再次初始化之前调用clearInterval。

function updateTime() {
    countTime();
    clearInterval(timeInt); // Here
    timeInt = setInterval(countTime,1000);
    console.log('updated time from server');
};

【讨论】:

  • OP 表示 updateTime() 仅每 45 分钟调用一次,但内存使用量在更短的时间内增加。
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2011-06-24
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多