Google Maps JS v3 - 分离的DOM树 - 内存泄漏?

时间:2014-01-15 16:12:23

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

我有以下问题。我将通过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树中,在创建地图之前进行比较时/在它们被销毁之后进行比较时,仍然是谷歌地图图块:

enter image description here

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

我该怎么做才能找出造成DOM漏洞的原因?

1 个答案:

答案 0 :(得分:30)

这是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/

按下开始后,您将观察到浏览器在内存中增长,直到您按下停止。

问题尚未解决,似乎没有正式的解决方法。肯定有一种方法,但这并不是一个干净的解决方法,显然可能会停止在下一版谷歌地图中停止工作,引用the discussion

  

我实际上已经设法通过手动找到半可行的修复程序   摧毁谷歌地图创造的许多元素(和   删除监听器)。但是,我使用了很多未记载的东西   这样做(我必须检查铬检查员,看看要尝试什么   删除),所以这似乎不是正确的方法。