2010-03-27 9 views
78

¿Hay alguna forma de averiguar cuánta memoria está utilizando una página web o mi aplicación jquery?jQuery o javascript para encontrar el uso de memoria de la página

Aquí está mi situación:

Estoy construyendo una aplicación web pesada de datos utilizando una interfaz de jQuery y un backend de descanso que sirve de datos en JSON. La página se carga una vez, y luego todo sucede a través de ajax.

La interfaz de usuario proporciona a los usuarios una forma de crear múltiples pestañas dentro de la interfaz de usuario, y cada pestaña puede contener una gran cantidad de datos. Estoy considerando limitar el número de pestañas que pueden crear, pero pensé que sería bueno limitarlas solo una vez que el uso de la memoria haya superado un cierto umbral.

Sobre la base de las respuestas, me gustaría hacer algunas clarfications:

  • estoy en busca de una solución en tiempo de ejecución (no sólo las herramientas de desarrollo), de modo que mi aplicación puede determinar acciones basadas en el uso de memoria en el navegador de un usuario
  • El recuento de los elementos DOM o el tamaño del documento puede ser una buena estimación, pero podría ser bastante inexacto, ya que no incluiría eventos vinculantes, datos(), complementos y otras estructuras de datos en memoria.
+0

Usted debe investigue el tipo de usuarios para su aplicación web para determinar si tienen o no problemas de memoria mientras usa su aplicación web. ¿O tienes problemas de memoria/rendimiento con tu aplicación web? – Prutswonder

+0

@Prutswonder: No, no estoy teniendo problemas, pero tenía curiosidad por saber si existe tal herramienta. Solo pensé que en lugar de solo establecer un límite fijo en las pestañas, un método dinámico podría ser genial. – Tauren

+0

Acabo de agregar algunos detalles adicionales a la pregunta para ayudar a aclarar que estoy buscando una solución de tiempo de ejecución, no una solución de tiempo de compilación. – Tauren

Respuesta

49

2015 Actualización

Ya en 2012 esto no era posible, si usted quiere apoyar a todos los principales navegadores en uso. Desafortunadamente, ahora mismo sigue siendo una función Chrome only (una extensión no estándar de window.performance).

window.performance.memory

apoyo del navegador: Chrome 6+


2012 respuesta

¿Hay una manera de averiguar la cantidad de memoria está siendo utilizado por una página web, o por mi aplicación jquery? Estoy buscando una solución de tiempo de ejecución (no solo herramientas de desarrollador), para que mi aplicación pueda determinar acciones basadas en el uso de memoria en el navegador de un usuario.

La respuesta simple pero correcta es no. No todos los navegadores le exponen dichos datos. Y creo que debería abandonar la idea simplemente porque la complejidad e inexactitud de una solución "hecha a mano" puede presentar más problemas de los que resuelve.

elementos de recuento DOM o el tamaño del documento podría ser una buena estimación, pero podría ser bastante inexacta, ya que no incluiría la unión caso, los datos(), plugins y otras estructuras de datos en la memoria para.

Si realmente quiere seguir con su idea, debe separar el contenido fijo y dinámico.

El contenido fijo no depende de las acciones del usuario (memoria utilizada por archivos de comandos, complementos, etc.)
Todo lo demás se considera dinámico y debe ser su enfoque principal al determinar su límite.

Pero no hay una manera fácil de resumirlos. Puede implementar un sistema de seguimiento que reúna toda esta información. Todas las operaciones deben llamar a los métodos de seguimiento apropiados. por ejemplo:

Ajustar o sobrescribir jQuery.data método para informar al sistema de seguimiento acerca de las asignaciones de datos.

Envuelva las manipulaciones html para que también se rastree la adición o eliminación de contenido (innerHTML.length es la mejor estimación).

Si mantiene grandes objetos en la memoria, también deberían ser monitoreados.

En cuanto a la vinculación de eventos, debe usar la delegación de eventos y luego también podría considerarse un factor algo fijo.

Otro aspecto que hace que sea difícil estimar correctamente los requisitos de memoria es que diferentes navegadores pueden asignar memoria de forma diferente (para objetos Javascript y elementos DOM).

+0

¿'innerHTML.length' no toma memoria o RAM o CPU (o cualquier otra cosa, no tengo ni idea) para procesar también? – mrReiha

+0

El soporte del navegador para esta característica NO es IE9 + ni nada que no sea Chrome. Window.performance.memory solo tiene Chrome. https://docs.webplatform.org/wiki/apis/timing/properties/memory – Blunderfest

+0

Tiene razón, pensé que la memoria formaba parte del estándar de sincronización de navegación y del objeto 'window.performance'. Las antiguas entradas "compatibles con" eran aplicables para ese estándar. 'window.performance.memory' es considerada una extensión * no estándar * por Chrome. – galambalazs

7

No conozco ninguna forma de saber realmente la cantidad de memoria que está utilizando el navegador, pero es posible que pueda utilizar una heurística basada en el número de elementos de la página. Uinsg jQuery, podría hacer $('*').length y le dará la cuenta de la cantidad de elementos DOM. Honestamente, sin embargo, probablemente sea más fácil hacer algunas pruebas de usabilidad y obtener una cantidad fija de pestañas para apoyar.

+2

@tvanfosson: no es una mala idea, pero esto no me va a dar información sobre la memoria que no es DOM, como.datos() y en estructuras de datos de memoria. Pero podría dar una buena estimación del peso total que podría usar. – Tauren

3

Si desea ver solo para probar, hay una forma en Chrome a través de la página del desarrollador para rastrear el uso de la memoria, pero no está seguro de cómo hacerlo en javascript directamente.

+0

@Zachary: gracias. Ciertamente estaré usando herramientas de desarrollo, pero esperaba encontrar una solución de análisis en tiempo de ejecución. – Tauren

+1

Si encuentras uno que me avise, me encantaría tener uno práctico –

-1

Lo que podría querer hacer es hacer que el servidor realice un seguimiento de su ancho de banda para esa sesión (cuántos bytes de datos se han enviado a ellos). Cuando sobrepasan el límite, en lugar de enviar datos a través de ajax, el servidor debe enviar un código de error que JavaScript usará para decirle al usuario que ha usado demasiados datos.

+0

@incrediman: también es una idea genial, pero no creo que funcione sin tener muchas características de seguimiento: solo un byte contar no funcionaría. El problema es que los datos en una pestaña son una lista que el usuario filtrará y ordenará de muchas maneras diferentes. Cada vez que realizan cambios, se recuperarán nuevos datos del servidor y se reemplazarán los elementos dom actuales. Además, ¿qué dicen que no presionen "recargar" y comiencen con una página nueva? Tendría que hacer un seguimiento de 304 y demás, pero tengo la intención de servir solo html estático, todos los datos provienen de un servicio REST. – Tauren

0

Puede obtener document.documentElement.innerHTML y verificar su longitud. Le daría la cantidad de bytes utilizados por su página web.

Esto puede no funcionar en todos los navegadores. Entonces puedes encerrar todos los elementos de tu cuerpo en un div gigante y llamar a innerhtml en ese div. Algo así como <body><div id="giantDiv">...</div></body>

+3

Es poco probable que la longitud de la cadena 'innerHTML' generada * sea * útilmente corroída con la memoria que utiliza el navegador (por ejemplo, en su modelo de objeto interno) para representar ese HTML. –

+0

y por qué es eso? Mi razón de ser es que si algún texto se carga en el navegador, debe almacenarse en la memoria. ASÍ, da cierta medida de la memoria utilizada por el navegador para representar la página. – Midhat

+3

Piénsalo de esta manera. Si dices "me gustaría darte 10 millones de dólares", son 8 palabras. Por otro lado, si dijeras "me gustaría estornudar en tu servilleta", eso es 7. ¿El primero es solo 8/7 más valioso que el segundo? – intuited

4

Uso del Chrome Heap Snapshot tool

Hay también una herramienta Firebug llamada MemoryBug pero parece que aún no está muy maduro.

+0

@Pablo: Gracias. Ciertamente estaré usando herramientas de desarrollo, pero esperaba encontrar algo que pudiera usar durante el tiempo de ejecución para encontrar el uso de memoria en el navegador de cada usuario. – Tauren

38

Puede usar el Navigation Timing API.

Navigation Timing es una API de JavaScript para medir con precisión el rendimiento en la web. La API proporciona una forma simple de obtener estadísticas de tiempo precisas y detalladas, de forma nativa, para la navegación de la página y eventos de carga.

window.performance.memory da acceso a los datos de uso de memoria de JavaScript.


lecturas recomendadas

+4

Esta debería ser la respuesta correcta en mi opinión. –

+0

Gran sugerencia. Gracias. – MaximOrlovsky

1

momento perfecto pregunta conmigo comenzando en un proyecto similar!

No existe una forma precisa de controlar el uso de la memoria JS en la aplicación, ya que requeriría privilegios de nivel superior. Como se mencionó en los comentarios, verificar el número de todos los elementos, etc. sería una pérdida de tiempo ya que ignora los eventos enlazados, etc.

Esto sería un problema de arquitectura si la memoria pierde elementos manifiestos o no utilizados persisten. Asegurarse de que el contenido de las pestañas cerradas se elimine por completo sin que persistan los controladores de eventos, etc. sería perfecto; suponiendo que se hace sólo podría simular un uso intensivo en un navegador y extrapolar los resultados de monitoreo de memoria (tipo sobre: ​​memoria en la barra de direcciones)

Protip: si se abre la misma página en IE, FF, Safari ... y Chrome; y que navegue al sobre: ​​memoria en Chrome, informará sobre el uso de memoria en todos los otros navegadores. ¡Ordenado!

+3

chrome.respect ++ –

3

Me gustaría sugerir una solución completamente diferente de las otras respuestas, es decir, observar la velocidad de su aplicación y una vez que cae por debajo de los niveles definidos, mostrar consejos al usuario para cerrar pestañas o desactivar nuevas pestañas para abrir. Una clase simple que proporciona este tipo de información es, por ejemplo, https://github.com/mrdoob/stats.js. Aparte de eso, puede que no sea prudente que una aplicación tan intensa mantenga todas las pestañas en la memoria en primer lugar. P.ej. mantener solo el estado del usuario (desplazamiento) y cargar todos los datos cada vez que se abren todas las pestañas menos las dos últimas podría ser una opción más segura.

Por último, los desarrolladores de webkit han estado discutiendo la posibilidad de agregar información de memoria a javascript, pero han recibido una serie de argumentos sobre qué y qué no deberían exponerse. De cualquier manera, no es improbable que este tipo de información esté disponible en unos pocos años (aunque esa información no es muy útil en este momento).

13

Esta pregunta tiene 5 años de antigüedad, y tanto los navegadores como los navegadores han evolucionado increíblemente en este momento. Dado que esto ahora es posible (al menos en algunos navegadores), y esta pregunta es el primer resultado cuando Google "javascript muestra el uso de la memoria", pensé que ofrecería una solución moderna.

memoria stats.js: https://github.com/paulirish/memory-stats.js/tree/master

Este script (que se puede ejecutar en cualquier momento en cualquier página) mostrará el useage de memoria actual de la página:

var script=document.createElement('script'); 
 
script.src='https://rawgit.com/paulirish/memory-stats.js/master/bookmarklet.js'; 
 
document.head.appendChild(script);

+1

Eres un ser humano extremadamente útil. –

+0

Esto parece estar reportando el uso de la memoria JS y no el uso de la memoria de la página, el Administrador de Tareas incorporado de Chrome dice que Gmail está usando 250MB mientras que la memoria-stats.js informa 33.7MB – Brandito

Cuestiones relacionadas