potential paused memoria collector chrome before google-chrome garbage-collection mootools javascript

google chrome - paused - Chrome no puede liberar memoria, la recolección de basura no se produce como se esperaba(biblioteca Mootools/MochaUI)



paused before potential out of memory crash (2)

Antecedentes : Actualmente estoy trabajando en un sitio de intranet que hace uso de la biblioteca MochaUI (que funciona desde la demostración del escritorio virtual ). Estoy usando Mootools 1.2.4 y MochaUI 0.9.7. Las ventanas que se abren en mi implementación de "escritorio virtual" cargan su contenido a través de iframes. Algunas de las páginas cargadas son bastante pesadas en términos de CSS y secuencias de comandos, por lo que es importante que los objetos de la Ventana se recojan adecuadamente cuando el usuario cierra una ventana. Esto es ostensiblemente atendido por la biblioteca (hace un trabajo justo cuando se usa Firefox).

Actualización La pregunta publicada originalmente se había vuelto demasiado larga con respecto a las ediciones / actualizaciones posteriores. El título ya no era exacto, así que cambié eso también. También, vea mi respuesta a continuación para una solución parcial.

Aquí están los puntos esenciales:

  1. Chrome funciona de esta manera:

    • Chrome no puede liberar la memoria asignada para los objetos de la ventana MochaUI cuando se cierran. En cambio, el uso de la memoria de Chrome se congela (literalmente) en el nivel alcanzado después de que la ventana haya terminado de cargar su contenido iframe, estableciendo un límite inferior en el uso de la memoria hasta que la página se actualice.
    • La memoria utilizada por el proceso continúa aumentando con las siguientes aperturas / cierres de ventanas. Eventualmente, se alcanza algún tipo de límite, y el uso de la memoria deja de escalar a medida que comienza a oscilar en lugar de saltar dramáticamente.
    • Este problema es más evidente cuando las ventanas en cuestión están cargando bastante contenido iframe (en memoria). La ventana que estoy usando para todos los propósitos de prueba carga una página de 580 kb (sin adjuntar) en su iframe.
  2. Curiosamente, la recolección de basura esperada tiene lugar, cuando

    • el navegador se minimiza posteriormente
    • Se abre otra pestaña en la misma ventana del navegador.
    • Se está grabando una línea de tiempo de memoria en las Herramientas de desarrollo. (opción de comedia)
    • ¿Este comportamiento sugiere algún posible enfoque para resolver el # 1?

No estoy seguro de si esto se probó en Windows, pero si es así, tenga en cuenta que cada vez que minimiza una ventana en Windows mueve todos los datos al archivo de paginación. Al abrir la ventana de nuevo, no moverá los bloques de memoria hacia atrás a menos que el programa intente acceder a ellos y, por lo tanto, la basura permanezca en el archivo de paginación pero no se haya recolectado.

Si lo automatizara, no solo ralentizaría el programa, tampoco ayudaría con los problemas de memoria.

ver la siguiente url para un poco más de información

https://micksmix.wordpress.com/2010/01/08/why-does-task-manager-show-an-applications-memory-usage-drop-after-minimizing-it-to-the-the-taskbar/


Actualizar
Los siguientes cambios en la función MochaUI closingJobs son una gran mejora con respecto a lo que publiqué anteriormente aquí. El cambio principal ahora es que el evento de descarga del iframe se llama manualmente al cambiar la propiedad src, en lugar de ser activado cuando el método windowEl.destroy elimina el iframe del DOM. (Tengo la idea de here ).

Si desea utilizar este código, simplemente elimine la función existente de closingJobs y copie y pegue este código en su lugar. Debería funcionar tanto con 0.9.7 como con 0.9.8 MochaUI, y con Mootools 1.2.4 o 1.3.

closingJobs: function(windowEl){ windowEl.setStyle(''visibility'', ''hidden''); var instances = MUI.Windows.instances; var instance_id = windowEl.id var cleanup_delay = 50; /* Reset canvases with width/height = 0. This pretty reliably frees a few hundred Kb of memory in chrome. */ instances[instance_id].canvasControlsEl.width = 0; instances[instance_id].canvasControlsEl.height = 0; instances[instance_id].canvasEl.width = 0; instances[instance_id].canvasEl.height = 0; if(instances[instance_id].options.loadMethod == ''iframe'') { /* The following line determines how long to delay the execution of the windowEl.destroy function. The line below gives 10 milliseconds per DOM element in the iframe''s document. You could probably do just as well with a hard-coded value. */ cleanup_delay = instances[instance_id].iframeEl.contentDocument.getElementsByTagName("*").length * 10; /* Set the Browser property in the iframe''s window to Internet Explorer. This causes Mootools to run its purge function, which iterates over all the iframe document''s DOM elements, removing events/attributes etc. Assuming you have mootools included in the iframe content. */ if(instances[instance_id].iframeEl.contentDocument.defaultView.MooTools) { if(instances[instance_id].iframeEl.contentDocument.defaultView.MooTools.version.contains("1.3")) instances[instance_id].iframeEl.contentDocument.defaultView.Browser.ie = true; else instances[instance_id].iframeEl.contentDocument.defaultView.Browser.Engine.trident = true; } instances[instance_id].iframeEl.src = "javascript:false"; } MUI.cleanWindow.delay(cleanup_delay, null, windowEl); }, cleanWindow: function(windowEl) { var instances = MUI.Windows.instances; var instance_id = windowEl.id if (Browser.ie){ windowEl.dispose(); } else { windowEl.destroy(); } instances[instance_id].fireEvent(''onCloseComplete''); /* Changed - Only execute getWindowWithHighestZindex() and focusWindow() functions if there will actually be open windows after the current one closes. */ if (instances[instance_id].options.type != ''notification'' && instances.__count__ > 1){ var newFocus = MUI.getWindowWithHighestZindex(); MUI.focusWindow(newFocus); } if (this.loadingWorkspace) this.windowUnload(); if (MUI.Dock && $(MUI.options.dock) && instances[instance_id].options.type == ''window''){ var currentButton = $(instances[instance_id].options.id + ''_dockTab''); if (currentButton != null){ MUI.Dock.dockSortables.removeItems(currentButton).destroy(); currentButton = null; //Is this necessary? } MUI.Desktop.setDesktopSize(); } //Changed - moved this to the end of the function. delete instances[instance_id]; }