2010-06-07 12 views
6

Tengo un javascript (usado con google maps api) que estoy probando en IE y Chrome y noté síntomas de pérdida de memoria en IE solamente: cuando actualizo la página continuamente, la cantidad de memoria utilizada en IE se mantiene creciendo (rápido), pero en Chrome se mantiene constante. Sin publicar todo el código (ya que es bastante largo), ¿puedo obtener algunas sugerencias sobre qué buscar? ¿Qué podría hacer que la memoria siga creciendo así en IE en las actualizaciones de página?javascript memory leak

Como dije, sé que es difícil sin código, pero me gustaría ver si algún consejo genérico funciona primero. Gracias.

Actualización: gracias por las respuestas hasta el momento. Como control de cordura, ejecuté el código de Google Maps api "Hello World" from google para ver qué pasaría en IE (el código se muestra a continuación). Cuando ejecuto este código en IE, cuando sigo refrescando la página una y otra vez, la memoria sigue creciendo y creciendo. ¿Es esto una pérdida de memoria? Esto no se parece como funcionalidad prevista ...

<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript"> 
    function initialize() { 
    var latlng = new google.maps.LatLng(-34.397, 150.644); 
    var myOptions = { 
     zoom: 8, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
    } 

</script> 
</head> 
<body onload="initialize()"> 
    <div id="map_canvas" style="width:100%; height:100%"></div> 
</body> 
</html> 

Actualización 2: Entonces, ¿hay ninguna manera de conseguir este código de mapa de Google API Hello World para funcionar sin fugas de memoria en el IE? Me di cuenta de que si ejecuto el mismo experimento en maps.google.com no parece haber una fuga ... Sería genial si alguien pudiera ayudarme a modificar el código hello world para que no se escape en IE; de esta forma puedo construirlo (no me importa usar JQuery si esto ayudara, pero lo intenté con el código de Hello World y todavía estaba goteando en IE). Gracias de nuevo

+1

IE 6 tenían un tema muy específico de fugas donde, si no nula a cabo todos los controladores de eventos (onclick, onmousever, proceso de carga) en Elementos HTML que fueron creati ng y destruyendo dinámicamente, esas referencias nunca obtendrían basura recolectada. Eso fue corregido en versiones posteriores. Entonces, si estás experimentando esto en IE6, es probable que sea tu problema (aunque el código de Google debería estar por encima de este problema). Recuerde que el navegador ejecutará su recolector de basura cuando le apetezca, y casi nunca cuando lo espera. ¿El uso de la memoria disminuye si esperas? – Andrew

+0

De hecho, estoy usando IE 7, y la memoria no baja cuando se espera ... ¿cómo iba a "nulos fuera todos los controladores de eventos" cuando me basta con conectarlo a ? – hhj

+1

Si está utilizando IE 7, este problema no debería afectarlo. El problema antes era si tenía todos los elementos que tenían eventos ligados a ellos (si el mapa tiene la función de arrastrar y soltar, entonces no) - que tendría que recorrer todos los elementos que tenían controladores de eventos y decir ' document.getElementById ('mydiv'). onclick = null; 'etc. Pero tiene toda la razón. En el caso de tu código anterior, no hay nada malo que estés haciendo que yo pueda ver. Debe ser un problema con el código de Google, la peor respuesta que puedo dar. – Andrew

Respuesta

7

Actualización:

He probado el código anterior con drip.exe y parece que no hay realmente algo así como una pérdida de memoria. El uso de la memoria aumentó de forma constante mientras se ejecutaba el código con la actualización automática durante algunos minutos.

Actualización 2:

Creo que este es el error: http://code.google.com/p/gmaps-api-issues/issues/detail?id=1555&can=1&q=unload&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Internal%20Stars

+0

¿Qué te lleva a pensar que el problema de la API apneada es el problema? no parece tener mucho que ver con las pérdidas de memoria de IE. Estamos encontrarse con el mismo problema en IE7, parece ser algo sensacional para ese navegador ... – matao

+0

@matao las pruebas con goteo son muy significativa \t – powtac

+0

@matao, como dije en mi sección de actualización, goteo muestra que el MEM el consumo aumentó mientras se actualizaba y, dado que no hay otro código que los g mapas, la fuga tiene que estar en algún lugar allí. Estoy seguro de que, mientras tanto, este problema fue resuelto por g, o la sugerencia de Andrew acuerdo con los documentos deben ser utilizados: 'onunload = "GUnload()"' – powtac

1

Una fuente bien conocida de las pérdidas de memoria de IE es el atrapamiento (deliberada o accidental) de Javascript "cosas" en cierres (funciones) vinculadas como manejadores de eventos a los elementos DOM. La mayoría de los marcos tratan de limpiar los manejadores de eventos explícitamente por esa razón.

1

También debe ejecutar la carga de GU antes de abandonar la página.Basta con añadir un evento de "descarga":

<body onload="initialize()" onunload="GUnload()"> 

Lea más sobre esta fuga en el Google Maps API

+2

que estoy usando API v3. Gracias por la sugerencia, sin embargo. – hhj