2012-11-19 31 views
3

我需要在高度動態的Web應用程序中執行jsonp長輪詢,但是我遇到大量內存泄漏。最初,我使用了Socket.IO和jsonp傳輸,並得到了相同的結果,然後設置了一個JQuery測試頁,以查看問題是否僅在socket.io庫中進行了本地化。 我發現我也驚訝地發現從JQuery做jsonp輪詢也導致了相同的結果:在IE9中,內存從大約80-90 MB增加到超過1.8 GB(非常快)(小於10分鐘):(。JQuery JSONP輪詢內存泄漏

He're是客戶端的測試代碼:

<html> 
<head> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">   
    <script type="text/javascript"> 
     $(document).ready(function() { 
      var doPoll = function() { 
       $.ajax({ 
        type: 'GET', 
        url: "http://<server-url>/jquery-jsonp/server.php", 
        cache: false, 
        async: true, 
        crossDomain: true, 
        dataType: "jsonp", 
        success: function (data, status) { 
         console.log("Received response"+data); 
         doPoll(); 
        }, 
        error: function (xhr, textStatus, errorThrown) { 
         // access denied 
        } 
       }); 
      } 

      doPoll();  
     }); 
    </script> 
</head> 

這裏是虛擬服務器響應:

<?php echo $_GET['callback']."(".json_encode(array("status"=>"success")).")"; 

正如你可以看到這裏沒有什麼特別的是什麼原因造成的任何想法這和可能的解決方法?

該請求需要跨源執行,我們必須支持IE8/9。 非常感謝。

+0

你有解決這個問題的辦法嗎?它也發生在我身上......這裏的問題是,我們正在使用Phonegap作爲移動應用程序,並且即使在更改頁面時也會出現問題...:-X – Sebastian

回答

1

嘗試的幾秒鐘的時間間隔調用doPoll(),像這樣:

success: function (data, status) { 
    console.log("Received response"+data); 
    setTimeout(doPoll, 10000); // 10 second wait before next request sent 
}, 
0

你並不需要輪詢你收到迴應的時刻。與普通的計算機操作相比,HTTP傳輸速度可能較慢,但它們通常比人類反應快一些。延遲至少幾秒鐘將是一個好主意。

這表示應該指出,HTTP輪詢最好是相當不可靠的。以HTML的臉書聊天爲指​​標,它可能會有多麼不可靠。

編輯:

,大家好,感謝您的答覆。延遲下一個請求是不是這個應用

那麼你不應該使用網頁這是一個 選項。改爲編寫桌面或移動應用程序。如果你的回答是「這不是一個選項」。那麼就不存在可行的選擇。 HTTP/HTML/Javascript只是而不是,旨在用於「每秒傳遞給用戶的高度動態的關鍵業務更新」,我懷疑它永遠都會如此。

+0

夥計們,感謝您的回覆。不幸的是,延遲下一個請求並不是這個應用程序的一個選項,因爲它是高度動態的,所有更新每秒都會傳送到用戶界面,這是關鍵的bussines,儘快(每秒很多不同的事情可能發生服務器端和UI需要被通知所有這些)。所以我需要每秒處理至少5-10個請求,這就是爲什麼我最初想要使用Socket.IO,但即使在這個庫中內存問題仍然存在。 – user1835551

+0

我也試過用常規的XHR輪詢而不是JSONP來查看會發生什麼(只是刪除了dataType:「jsonp」設置,並用dataType替換了它:「json」。其餘代碼不變),並且內存上升但速度遠遠低於使用jsonp的速度(在1小時內它從40MB增加到300MB)。我會檢查它是否在某個時間點停止並更新評論。儘管如此,我仍然不明白爲什麼JSONP會佔用太多的內存,爲什麼即使XHR輪詢技術繼續增加IE9的內存使用量。我期望內存不時得到清理。 – user1835551

+0

查看我的編輯.... –

0

所有的建議都是有效的,即使您需要每半秒鐘輪詢一次服務器,您應該添加一個幾毫秒的超時時間以使JavaScript稍作停頓,以便它可以開始清除內存。

另一個問題是JSONP,因爲這會在DOM中創建帶有響應的新標籤。您應該開始刪除未使用的節點,否則您的頁面大小將無限增長,最終會超出內存。