【发布时间】:2011-11-18 18:49:25
【问题描述】:
我在加载 Google 地图并不断从一个点平移到另一个点的 Web 应用程序时遇到 Javascript Out of Memory 错误。它需要大约半天的时间才能耗尽内存,但我真的希望它持续更长时间。一世 已经确定在使用 map.panTo 方法时会发生内存泄漏,尽管 我非常怀疑这可能是我使用它的方式(Javascript不是我的强项 适合)。你能看看这段代码并帮我解决这个内存泄漏吗?为了调试期间的时间,我加快了它在此演示代码中平移的时间间隔(即使通过检查 Windows 任务管理器中的进程,泄漏也很明显)。这运行 ASP .Net 3.5 Web 表单,但没有 PostBacks,代码完全是 HTML、CSS 和 Javascript。它在 IE 中泄漏最严重(这是我需要用来显示它的)。
编辑:
- 我尝试过使用不同版本的 Google Maps 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>
【问题讨论】:
-
您正在下载多少兆字节的图像?
-
有点难以证明是否定的(泄漏“无法修复”):-) 我已提交给 Google 论坛,请参阅下面的更新答案。
标签: javascript asp.net google-maps memory-leaks