Pregunta Las instancias a las que hace referencia 'bound_this' solo no son basura recolectada


Tengo una pregunta sobre la recolección de basura en google chrome (Versión 20.0.1132.47, Ubuntu 11.04 64bit).

Mientras comparaba los volcados de pila y comprobaba si había fugas de memoria, descubrí algunas instancias que nunca se limpian. Normalmente este comportamiento se puede rastrear hasta un error de programador, pero en este caso no tengo ni idea.

Eche un vistazo a la siguiente captura de pantalla Screenshot of heap-dump showing an instance (child) referenced only by 'bound_this'

La instancia 'child @ 610739' es referenciada solo por las instancias 'bound_this' que pertenecen a las funciones de la instancia child misma. Por lo tanto, a mi entender, la instancia hija debe ser recolectada como basura, ya que la única otra referencia que lo mantiene es la instancia hija misma (a través de las funciones 'bound_this').

Estoy usando la función de utilidad underscore.js '' bindAll '(underscore.js # bindAll) que se asigna a la función 'native_bind' de cromo (ECMA Script wiki en bound_this)

¿Me estoy perdiendo algo obvio aquí y, si es así, alguien podría explicar qué es lo que mantiene estas instancias con vida?

ACTUALIZAR:
Mientras tanto probé la misma aplicación en chrominium (18.0.1025.168 (Desarrollador Build 134367 Linux) Ubuntu 11.10) que no muestra estas instancias colgantes.

ACTUALIZACIÓN 2:
Siguiendo la sugerencia de Esailijas de proporcionar un fragmento jsfiddle, creé uno (http://jsfiddle.net/8gSTR/1/) que imita lo que estoy básicamente haciendo. La ejecución de este violín desafortunadamente no muestra la mala conducta que estoy experimentando en mi aplicación. Un heap-dump tomado mientras se siguen haciendo referencia a 'a'-instances parece similar aunque a pesar de la referencia de la matriz window.o que mantiene activas las instancias: Heap-dump taken during execution of jsfiddle mentioned above

Como tal, falta una referencia en mi caso (captura de pantalla 1). No sé qué impide que Chrome libere estas instancias ...

ACTUALIZACIÓN 3:
Seguido loislos consejos para habilitar propiedades ocultas. El resultado (con una de las ramas expandidas) se puede ver en la siguiente captura de pantalla, pero no me lleva más lejos. Heap-dump with hidden properties enabled


32
2017-07-20 09:13


origen


Respuestas:


Sus sospechas de que esto no es una pérdida de memoria real, pero la rareza con Chrome es correcta.

Recientemente encontré el mismo problema. IE11 no mostrará this.func = _.bind (this.func, this) como una pérdida de memoria mientras que Chrome lo hará, incluso después de presionar el botón de recolección de basura 100 veces.

Lo mostrará incluso después de ejecutar Chrome con el sinsentido jsflag y exponer el recolector de basura subyacente y llamar a gc 100 veces.

Una forma fácil de demostrar que no es una fuga en Chrome es convertir un problema menor en un problema importante con el navegador y forzar al motor a tomar medidas.

En la instancia que tiene la función vinculada asignada, asigne una nueva propiedad como esta:

target.WhyAmILeaking = new Array (200000000) .join ("YOURNOT");

Haz la técnica de las tres instantáneas con cromo y verás esa cadena presente en el montón marcando alrededor de 214 mb. Haga de nuevo la acción constructiva (la segunda instantánea) y verá que el montón va a 423 mb o se queda en 214 mb. Si se queda, terminaste ya que demostraste que se han recogido los 214 mb originales. Si no se queda, realiza tu acción destructiva (tercera instantánea) y volverá a los 214 mb también probando que el original fue recolectado.

Si se queda a 423 mb, señor o señora tienen una fuga.

Ah, y otro grupo de almas pobres que se encontraron exactamente en la misma situación: https://github.com/jashkenas/backbone/issues/2269#issuecomment-13610969

TL; DR; use IE 11 para detectar fugas.


3
2018-03-05 13:04



He referido esto en EcmaScript, este término "liga esto" con clase,

Los métodos de clase han "enlazado esto", donde esto en el cuerpo del método siempre está vinculado a la instancia de clase de la que se extrajo el método, independientemente de qué este parámetro se pase al método (se ignora este parámetro para el método) .

Ahora, aquí, en su ejemplo, no hay una secuencia de comandos de muestra, así que no puede ser específico para la pregunta,

Tengo que decir si esto no es una fuga ...

entonces, con cualquier objeto, la clase del script está limitada, no llamará a basura hasta que exista la clase / objeto, ya que esta función está limitada con el mismo objeto ... solo se recolectará basura después de la de su padre (el objeto / clase con la que es limitado) finaliza el alcance.

Ahora bien, si la referencia circular cuando la tarea finalizará llegará a su fin, >> esto funciona como concepto de recursión (mente, concepto, no lo mismo que) ... así que el final comenzará desde la última llamada ... en reversa ... el la llamada más interna (última llamada) se lanzará primero ... y así sucesivamente

El código debe tener errores, ya que no deben vincular y definir la función y reutilizar cada vez ... pero si son vinculantes, entonces también debería funcionar bien y no debería perderse hasta que la huella salga del límite del explorador del grupo de memoria.

Espero que esto explique ...


1
2017-07-16 05:17



¿Está activando un "GC forzado" utilizando las herramientas de desarrollador? Si ese es el caso y los objetos persisten entonces la investigación anterior es valiosa.

Si no está activando un GC a través de las herramientas de desarrollo, recuerde que la forma en que funciona el motor de GC es bastante complicada y tiene el concepto de recopilación generacional (utilizando dos generaciones).

http://www.html5rocks.com/en/tutorials/memory/effectivemanagement/#toc-v8-gc

Simplemente podría ser que no ha alcanzado el umbral requerido para activar un GC de generación joven, o que los objetos han estado en posesión de la generación anterior, pero que nunca se activó un GC de una generación anterior.

Lamentablemente, las herramientas de desarrollador no parecen mostrar qué generación fue GC'd.


1
2017-08-08 16:04