Dado que aparentemente no puede destruir las instancias del mapa, una forma de reducir este problema si
- necesitas mostrar varios mapas a la vez en un sitio web
- la cantidad de mapas puede cambiar con la interacción del usuario
- los mapas deben ocultarse y volver a mostrarse junto con otros componentes (es decir, no aparecen en una posición fija en el DOM)
mantiene un grupo de instancias de mapas. El grupo realiza un seguimiento de las instancias que se están utilizando y, cuando se solicita una nueva instancia, verifica si alguna de las instancias de mapa disponibles está libre: si lo está, devolverá una existente, si no lo está, creará una nueva instancia de mapa y devuélvala, agregándola al grupo. De esta manera, solo tendrá un número máximo de instancias igual al número máximo de mapas que haya mostrado simultáneamente en la pantalla. Estoy usando este código (requiere 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
}
}
}
Le pasa las opciones del mapa de inicio (según el segundo argumento del constructor de google.maps.Map), y devuelve tanto la instancia del mapa (en la que puede llamar a funciones pertenecientes a google.maps.Map) y el contenedor, que puede diseñar usando la clase "myDivClassHereForStyling", y puede agregar dinámicamente al DOM. Si necesita restablecer el sistema, puede usar mapInstancesPool.reset (). Restablecerá el contador a 0, mientras mantiene todas las instancias existentes en el grupo para su reutilización. En mi aplicación, necesitaba eliminar todos los mapas a la vez y crear un nuevo conjunto de mapas, por lo que no hay una función para reciclar una instancia de mapa específica: su kilometraje puede variar. Para eliminar los mapas de la pantalla, utilizo la separación de jQuery, que no destruye el contenedor del mapa.
Al usar este sistema y usar
google.maps.event.clearInstanceListeners(window);
google.maps.event.clearInstanceListeners(document);
y corriendo
google.maps.event.clearInstanceListeners(divReference[0]);
divReference.detach()
(donde divReference es el objeto jQuery del div devuelto del grupo de instancias) en cada div que estoy eliminando, logré mantener el uso de la memoria de Chrome más o menos estable, en lugar de que aumente cada vez que elimino mapas y agrego nuevos.