2016-02-11 307 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