我一直在使用加載Google Map的Web應用程序遇到Javascript內存不足錯誤,並且從一個點到另一個點不斷移動。它耗盡了大約半天的時間,但我真的很喜歡它持續很久。我 已經確定,使用map.panTo方法時發生內存泄漏,雖然 我非常懷疑它可能是我使用它的方式(Javascript不是我的強 套裝)。你可以看看這段代碼,並幫我解決這個內存泄漏問題嗎?在調試過程中,爲了保證時間的長短,我加快了它在此演示代碼中的時間間隔(即使通過檢查Windows任務管理器中的進程,泄漏也是顯而易見的)。這運行ASP.Net 3.5 Web窗體,但沒有回發,代碼完全是HTML,CSS和Javascript。它泄漏IE中最糟糕的(這是我需要用來顯示這個)。使用Google地圖的Map.panTo()方法導致Javascript內存泄漏
編輯:
- 我已經使用不同版本的谷歌地圖API(2,3.0和3.6)的嘗試。
- 我知道我不需要將示例代碼中的映射放入Hashtable或Array中,但不會影響內存泄漏。
- 我試圖避免黑客入侵,比如每隔一段時間刷新頁面或使用靜態Google Maps API。
- 賞金會去找誰如何解決內存泄漏或誰明確識別和證明爲什麼它不能被修復(如果是這樣的話)。
代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Map Shifter</title>
<style type="text/css">
#divMap { height: 400px; width:400px; position:absolute; top:10%; left:10%; border: 2px solid #ff1100; }
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=2&sensor=false"></script>
<script type="text/javascript" language="javascript">
//Have tried both HashTable and Array (Both Leak)...
var m_arrMaps = new HashTable(); //new Array();
var m_Timer;
function HashTable() {
return this;
}
function LoadMapAndStartShifting() {
var objMapCenterPoint = new google.maps.LatLng(20.5, -156);
var objMapOptions = { zoom: 9, center: objMapCenterPoint, mapTypeId: google.maps.MapTypeId.ROADMAP,
scaleControl: false, streetViewControl:false, zoomControl: false, mapTypeControl: false, panControl: false
}
var map = new google.maps.Map(document.getElementById("divMap"), objMapOptions);
m_arrMaps["ShiftingMap"] = map;
setTimeout("ShiftMap(20.5, -156);", 700);
}
function ShiftMap(decLat, decLng) {
var objLatLong = new google.maps.LatLng(decLat, decLng);
//Have tried setCenter instead of preferred panTo and it still leaks!
m_arrMaps["ShiftingMap"].panTo(objLatLong);
if (decLat == 20.5) {
//Leaks...
ResetTimer(39, -87);
}
else {
//Still leaks...
setTimeout("ShiftMap(20.5, -156);", 700);
}
}
function ResetTimer(decLat, decLng) {
m_Timer = setTimeout("ShiftMap(" + decLat + ", " + decLng + ");", 700);
}
</script>
</head>
<body onload="LoadMapAndStartShifting();">
<form id="form1" runat="server">
<div id="divMap"></div>
</form>
</body>
您正在下載多少兆字節的圖像? – c69
很難證明一個否定(泄漏「無法修復」):-)我已經提交給Google論壇,請參閱下面的更新答案。 –