Visto que, aparentemente, você não pode realmente destruir as instâncias do mapa, uma maneira de reduzir este problema se
- você precisa mostrar vários mapas de uma vez em um site
- o número de mapas pode mudar com a interação do usuário
- os mapas precisam ser ocultados e mostrados novamente junto com outros componentes (ou seja, eles não aparecem em uma posição fixa no DOM)
está mantendo um pool de instâncias do mapa. O pool rastreia as instâncias em uso e, quando é solicitada uma nova instância, verifica se alguma das instâncias do mapa disponível está livre: se estiver, retornará uma existente; se não estiver, criará um nova instância do mapa e retorná-la, adicionando-a ao pool. Dessa forma, você terá apenas um número máximo de instâncias igual ao número máximo de mapas que você já mostra simultaneamente na tela. Estou usando este código (requer jQuery):
var mapInstancesPool = {
pool: [],
used: 0,
getInstance: function(options){
if(mapInstancesPool.used >= mapInstancesPool.pool.length){
mapInstancesPool.used++;
mapInstancesPool.pool.push (mapInstancesPool.createNewInstance(options));
} else {
mapInstancesPool.used++;
}
return mapInstancesPool.pool[mapInstancesPool.used-1];
},
reset: function(){
mapInstancesPool.used = 0;
},
createNewInstance: function(options){
var div = $("<div></div>").addClass("myDivClassHereForStyling");
var map = new google.maps.Map(div[0], options);
return {
map: map,
div: div
}
}
}
Você passa as opções do mapa inicial (de acordo com o segundo argumento do construtor google.maps.Map) e ele retorna a instância do mapa (na qual você pode chamar funções pertencentes a google.maps.Map) e o contêiner, que você pode estilizar usando a classe "myDivClassHereForStyling" e pode anexar dinamicamente ao DOM. Se você precisar reiniciar o sistema, pode usar mapInstancesPool.reset (). Ele redefinirá o contador para 0, enquanto mantém todas as instâncias existentes no pool para reutilização. Em meu aplicativo, precisei remover todos os mapas de uma vez e criar um novo conjunto de mapas, então não há função para reciclar uma instância específica do mapa: sua milhagem pode variar. Para remover os mapas da tela, eu uso o detach do jQuery, que não destrói o contêiner do mapa.
Usando este sistema, e usando
google.maps.event.clearInstanceListeners(window);
google.maps.event.clearInstanceListeners(document);
e correndo
google.maps.event.clearInstanceListeners(divReference[0]);
divReference.detach()
(onde divReference é o objeto jQuery do div retornado do pool de instâncias) em cada div que estou removendo, consegui manter o uso de memória do Chrome mais ou menos estável, em vez de aumentar toda vez que excluo mapas e adiciono novos.