2010-04-19 16 views
11

Actualmente estoy reconsiderando el manejo de eliminación de objetos del marco de JavaScript qooxdoo.
Tenga una mirada en el siguiente diagrama (A se encuentra actualmente en su alcance):¿Qué algoritmos de recolección de basura utilizan los 5 principales navegadores?

diagram http://yuml.me/51747906.jpg

Digamos que queremos eliminar B. En general, cortar toda referencia entre todos los objetos. Esto significa que cortamos la conexión 1 a 5 en el ejemplo. ¿Es esto realmente necesario?
Por lo que he leído here, los navegadores utilizan el algoritmo de marca y barrido. En ese caso, solo tenemos que cortar la referencia 1 (conexión al alcance) y 5 (conexión al DOM) que podría ser mucho más rápido.
¿Pero puedo estar seguro de que todos los navegadores usan el algoritmo de marca y barrido o algo similar?

+0

Tal vez deberías decirnos cuáles son los 5 buscadores principales _are_ en tu opinión. ¿Son IE6, IE7, IE8, FF3 y Safari, por ejemplo? –

+1

Con 5 navegadores principales me refiero a FF (2, 3, 3.5, 3.6), Opera (9, 10, 10.5), Safari (3, 4), Chrome (2, 3, 4, 5) e IE (6, 7 , 8). –

Respuesta

2

Para cualquier recolector de basura decente (no solo marca y barrido), la conexión de corte 1 sería suficiente para liberar B (y C y D y la ventana). La asignación basada en el recuento de referencias no liberaría B y D debido a sus referencias cíclicas (B hace referencia a las referencias B y D), pero el recuento de referencias no es realmente una recolección de basura.

Creo que es seguro asumir que todos los navegadores usan un recolector de basura decente (bueno, con los navegadores, nada es realmente seguro, pero una implementación de JavaScript que no use un recolector de basura adecuado es improbable).

+1

El recuento de referencias no es suficiente para implementar la recolección de basura, pero aún puede formar parte de un GC decente. Cuando el conteo llega a 0, usted sabe positivamente que puede recoger el objeto. Este atajo puede permitirle GC muchos objetos sin un costoso paso de marcaje y barrido. Además, cuando llega la hora de hacer una marca y barrido, queda menos basura para limpiar. – MSalters

+0

El recuento de referencias es caro, debido a las actualizaciones de los recuentos (especialmente en lo que respecta a la memoria caché). De manera asintótica, incluso sin ciclos, el marcado y barrido es menos costoso que el recuento de referencias. El recuento de referencias, sin embargo, interactúa mejor con la memoria virtual en algunas situaciones, por lo que Perl lo usa (Perl cree en enlaces dinámicos por nombres en lugar de punteros, y por lo tanto crea muy pocos "ciclos verdaderos", sin embargo, Perl _also_ tiene una marca- y barrer GC). –

2

Lo que pasa es que en un mundo ideal, básicamente solo necesitas desconectar nodos DOM y escuchas nativas de eventos. Sin embargo, el problema es que el sistema original en qooxdoo se diseñó para navegadores con errores como IE6. Vimos el uso de la memoria masivamente reducido cuando eliminamos tanto como sea posible por nuestra cuenta. En el mundo actual, sin embargo, lo rediseñaría de una manera que esté bien en IE6, pero no optimizado para sus problemas.

También existe una diferencia de cierre completo de toda la aplicación (elimine todo) y solo para eliminar una sola fracción de una aplicación. En el último escenario, debes actuar con cuidado para no eliminar las cosas que aún se necesitan.

Cuestiones relacionadas