2012-09-22 14 views
14

Tengo una pausa significativa en la recolección de basura. Me gustaría identificar los objetos más responsables de esta colección antes de intentar solucionar el problema. Miré la instantánea de Heap en Chrome, pero (corríjame si me equivoco) no puedo encontrar ningún indicador de lo que se está recopilando, solo lo que está ocupando más memoria. ¿Hay alguna manera de responder esto empíricamente, o estoy limitado a conjeturas educadas?¿Cómo puedo determinar qué objetos está recogiendo el recolector de basura?

+2

¿Cómo puede estar seguro de que las pausas son causados ​​por ¿recolección de basura? – pencil

+0

¿Has leído esto? http://gent.ilcore.com/2011/08/finding-memory-leaks.html?m=1 – HerrSerker

+1

@pencil Dos formas: coinciden con la caída de la memoria en la línea de tiempo de la memoria en Chrome, y cuando fuerzo el código para iterar en gran medida para inducir las pausas constantemente, la recolección de basura es (de lejos) la parte más lenta de mis resultados de creación de perfiles. – shino

Respuesta

3

Si está tratando de elegir entre algunos posibles culpables, puede modificar la definición del objeto para que se una al alcance global (como la lista debajo del documento o algo así). Entonces esto evitará que se recopilen. Lo cual puede hacer que el programa sea más rápido (no se reclame) o más lento (porque se acumulan y se controlan con el marcado y barrido cada vez). Entonces, si ve un cambio en el rendimiento, es posible que haya encontrado el problema.

Una alternativa es ver cuántos objetos se crean de cada tipo (configurar un contador en el constructor). Si los están recolectando mucho, también se están creando con la misma frecuencia.

+0

¡Eso es inteligente! Voy a intentarlo ahora, gracias. – shino

9

En los perfiles de cromo se necesitan dos instantáneas de montón, una antes de realizar la acción que desea verificar y otra después.

Ahora haga clic en la segunda instantánea.

En la barra inferior verá la casilla de selección con la opción "resumen". Cambiarlo a "comparación".

A continuación, en la casilla de selección junto a él, seleccione la instantánea con la que desea comparar (debe seleccionar automáticamente snapshot1).

Como resultado obtendrá la tabla con los datos que necesita, es decir. Objetos "Nuevo" y "Eliminado".

5

con los nuevos estrenos de Chrome no es una nueva herramienta disponible que es útil para este tipo de tareas:

el "Registro de Asignaciones del montón" tipo de perfiles. La herramienta de comparación "Heap SnapShot" regular (como se explica en las respuestas de Rafał Łużyński) no puede proporcionar ese tipo de información porque cada vez que toma una instantánea de montón, se ejecuta una GC, por lo que los objetos GCed nunca forman parte de las instantáneas. Sin embargo, con la herramienta "Registrar apilamiento de montones" constantemente se registran todas las asignaciones (es por eso que puede ralentizar mucho la aplicación cuando está grabando). Si está experimentando ejecuciones frecuentes de GC, esta herramienta puede ayudarlo a identificar lugares en su código donde se asigna mucha memoria. Junto con la comparación Heap SnapShot, verá que la mayoría de las veces se asigna mucha más memoria entre dos instantáneas, que puede ver en la comparación. En casos extremos, la comparación no arrojará ninguna diferencia, mientras que la herramienta de asignación le mostrará una gran cantidad de memoria asignada (que obviamente tuvo que ser recogida de basura mientras tanto).

Por desgracia, la versión actual de la herramienta no muestra donde tuvo lugar la asignación, pero le mostrará lo se ha asignado y cómo se fue retenido en el momento de la asignación. A partir de los datos (y posiblemente de los constructores), sin embargo, podrá identificar sus objetos y, por lo tanto, el lugar donde se asignan.

3

Tome un vistazo a https://developers.google.com/chrome-developer-tools/docs/heap-profiling

especialmente contención Ver

La vista contención es esencialmente una "vista de pájaro" de la estructura de los objetos de la aplicación . Le permite mirar dentro de los cierres de la función , observar los objetos internos de la VM que juntos componen sus objetos de JavaScript , y comprender cuánta memoria usa su aplicación en un nivel muy bajo.

La vista ofrece varios puntos de entrada:

objetos DOMWindow - estos son objetos considerados como "global" objetos para el código JavaScript; Raíces de GC: raíces de GC reales utilizadas por la basura de VM colector; Objetos nativos: objetos del navegador "empujados" dentro de la máquina virtual de JavaScript para permitir la automatización, p. nodos DOM, reglas CSS (ver la siguiente sección para más detalles.) A continuación se muestra el ejemplo de lo que la vista de contención parece:

enter image description here

+0

Por lo que yo entiendo, los objetos que pueden ser basura recolectados no aparecerán en esta vista, porque antes de que se tome la instantánea, se realiza una ejecución de GC. Dado que el OP quiere saber qué objetos tienen GCed, esto realmente no va a ayudar, ¿o no? – Sebastian

Cuestiones relacionadas