2016-02-11 254 views
0

我有以下javascript代码,要循环浏览我的服务器上的多个页面(用于数字标牌)。Javascript可能会发生内存泄漏

此代码用于所有页面,并且(此刻)每3秒在页面上循环一次(请参阅超时)。但是,浏览器的内存使用量增长缓慢而稳定。 2小时后,它从192mb使用到436mb使用。由于这是一个Raspberry Pi,只有512MB专用于CPU的内存,因此不太实用。

这段代码中是否有明显的内存泄漏?我自己并不是专家,但由于这些事情一天会运行8-12小时,可能我正在谈论20次/分钟,所以每天需要+/- 9600-14400重新加载。更多,如果它没有得到关闭..

$(document).ready(function() { 
    versionPage = parseInt(document.getElementById("version").innerHTML); 
    versionServer = 0 
    urls = 0; 
    getVersion(); 
    currentPage = getPage(); 
    getContent(); 
    main(); 

    function getPage() { 
     page = window.location.href.split("/"); 
     return page[page.length-1]; 
    } 

    function getVersion() { 
     $.ajax({ 
      url: "http://localhost/getVersion", 
      type: "GET", 
      dataType: "json", 
      success: function(json) { 
       console.log("json" + json); 
       versionServer = json; 
       if (versionServer != versionPage) { 
        console.log("Difference!"); 
       } 
       else { 
        console.log("Same!"); 
       } 
      }, 
     }); 

    } 



    //saves how much urls there are 
    function getContent() { 
     $.ajax({ 
      url: "http://localhost/getContent", 
      type: "GET", 
      dataType: "json", 
      success: function(json) { 
       console.log(json); 
       urls = json; 
      },  
     }); 
    } 


    //main function loop 
    function main() { 
     //check version every 
     window.setInterval(function() { 
      getVersion(); 
      if(versionServer != versionPage) { 
       window.location.href = "http://localhost:5000/1" 
      } 
      if(urls != 1) { 
       nextPage =(parseInt(currentPage) % urls) + 1; 
       window.location.href = "http://localhost:5000/" + nextPage; 

      } 
     }, 3000); 
    } 
}); 
+0

你用变量污染全局命名空间,似乎没有太多的异步编程经验,但我没有看到任何明显的东西可以解释这种维度的内存增加。也许这是浏览器保持历史和状态(如表单)和/或图像,......这样的事情? (只是猜测)你有没有监测流量,哪些文件被加载,以及它们有多沉重。 – Thomas

+0

他们只是纯html文件,几个div,一些文本,背景颜色。真的很简单。你是对的,我远离一位经验丰富的JS作家。这就是为什么我认为这是我的编程中的东西。所有文件也是本地文件。总是相同的文件,在测试中有3个。 – Lonefish

回答

1

我不得不问你这个评论,但它需要“50声望”发表评论。

你有没有试过把你的代码放到一个外部的Javascript文件中,比如“signagelooper.js”,然后依次循环你的页面。这样你的Looper函数总是有一个实例在运行。纠正我,如果这是你不想做的事情。

+0

这是我想要做的,但因为我有例如5页,我必须重新加载它们,不是吗?我不能让Javascript取代一个完整的HTML页面,或者我错了吗?它已经在外部文件中,但在每个页面中都会调用它。 – Lonefish

+0

'我不能只是用Javascript替换一个完整的html页面,或者我错了吗?只要你说的是完整的HTML页面即可。卸载样式表和脚本可能会变得讨厌,但其余的都没有问题。 – Thomas

+0

我知道你可以做到这一点,但这意味着完全重构程序/系统。然后我将如何获得HTML呢?我无法访问我的文件系统?这意味着我将不得不通过我认为的API?这最终会导致一个内存占用JavaScript文件。请记住,我在这里使用覆盆子pi .. – Lonefish