【问题标题】:Google Maps JS v3 - detached DOM tree - memory leak?Google Maps JS v3 - 分离的 DOM 树 - 内存泄漏?
【发布时间】:2014-02-04 05:17:51
【问题描述】:

我有以下问题。我正在通过以下代码通过setMap(null) 选项删除对谷歌地图实例的所有引用,包括标记:

destroyMaps = function () {
    leftMap = null;
    window.map = null;
    geocoder = null;
    for (var i=0; i<window.rightMarkers.length; i++) {
        window.rightMarkers[i].setMap(null);
        window.rightMarkers[i] = null;
    }
    window.rightMarkers = null;
    $("#map-canvas-right").remove();

    for (var i=0; i<window.leftMarkers.length; i++) {
        window.leftMarkers[i].setMap(null);
        window.leftMarkers[i] = null;
    }
    window.leftMarkers = null;
    $("#map-canvas-left").remove();

}

在我的整个代码中唯一引用leftMapwindow.map 的是:

对于window.map

var marker = new google.maps.Marker({
                    position: myLatlng,
                    map: window.map,
                    icon: window.pins[keyword_category.category_name],
                    shadow: window.pins["Shadow"],

                    title:job.job_title
});
marker.job_type =  keyword_category.category_name;
window.rightMarkers.push(marker);

对于leftMap

var marker = new google.maps.Marker({
                position: myLatlng,
                map: leftMap,
                icon: window.pins[keyword_category.category_name],
                shadow: window.pins["Shadow"],

                title:job.job_title
 });
 window.leftMarkers.push(marker);

但是,在我分离的 DOM 树中,在创建地图之前/销毁地图之后进行比较时,仍然是谷歌地图图块:

(右击 - 打开图片查看完整尺寸)

如何找出导致此 DOM 泄漏的原因?

【问题讨论】:

  • 您是否有任何事件处理程序附加到地图、标记...?
  • @AntoJurković 不,根本没有。如果需要,我可以链接到我的代码,但是中间有很多不相关的代码
  • 也许 GC 没有成功触发。您能否使用“收集垃圾”按钮(在底部)使用 Timeline chrome 开发工具选项卡进行另一次测试
  • @VladNikitin - 我已经尝试通过“时间轴”选项卡强制“垃圾收集”,但无济于事,暗示某处有参考。
  • jsfiddle.net/54Lf7 包含控制前端的整个代码。

标签: javascript google-maps dom google-maps-api-3 memory-leaks


【解决方案1】:

这是 Google Maps API v3 中的一个已知问题 - 即使是纯粹创建和销毁 google.maps 对象(不创建标记)也会导致内存泄漏。请参阅 Issue 3803: Bug: Destroying Google Map Instance Never Frees Memory

他们reproduce the issue 通过创建一个简单的循环来创建和销毁google.maps 对象。见

http://jsfiddle.net/KWf4r/

按开始后,您会观察到浏览器的内存增长,直到您按停止。

这个问题没有得到解决,似乎也没有官方的解决方法可用。当然有一种方法,但这不是一个干净的解决方法,显然可能会在下一个版本的 google maps api 中停止工作 - 引用the discussion

我实际上已经设法通过手动找到了一个半可行的修复方法 破坏谷歌地图创建的许多元素(和 删除听众)。但是,我使用了很多无证的东西 为此(我必须检查 chrome 检查器以查看要尝试的内容 删除),所以这似乎不是正确的方法。

【讨论】:

  • 另一种解决方法是 A) 重复使用相同的地图实例 B) 转移到 Bing?
  • 重用同一个地图实例对我有用。我通过在 jQuery 中抓取元素:window.$leftMap = $(".leftMap"); 并在返回时将其附加到父元素来重用它:$("#map-canvas-left").append(window.$leftMap);
  • 我将把悬赏留几天,看看是否有解决方案来实际销毁所有实例,如果没有,我会将悬赏奖励给这个答案。
  • rickyduck,你重复使用相同地图实例的实验很有趣!但我认为这不能解决您的问题 - 我认为您需要销毁谷歌地图并释放它使用的所有内存。如果你不需要重复使用地图,你仍然有泄漏。
  • 它解决了我的问题,因为它消除了我对时间紧迫的项目的内存泄漏问题。我正在破坏地图并重新启动它,因为需要完成一些负载工作。我现在已经更改了这段代码并使它成为可重用的实例,并且我的代码仍然有效。但是-您是正确的,它不能修复内存泄漏。不过,我宁愿你得到赏金来解决我的问题,也不愿它因为不能解决内存泄漏而消失。
猜你喜欢
  • 2013-05-29
  • 2011-07-22
  • 2014-02-09
  • 2012-02-09
  • 2017-11-16
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多