Quiero saber el tamaño ocupado por un objeto JavaScript.
Tome la siguiente función:
function Marks(){
this.maxMarks = 100;
}
function Student(){
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
Ahora instanciaré el student
:
var stud = new Student();
para poder hacer cosas como
stud.firstName = "new Firstname";
alert(stud.firstName);
stud.marks.maxMarks = 200;
etc.
Ahora, el stud
objeto ocupará algún tamaño en la memoria. Tiene algunos datos y más objetos.
¿Cómo averiguo cuánta memoria stud
ocupa el objeto? Algo así como un sizeof()
en JavaScript? Sería realmente increíble si pudiera descubrirlo en una sola llamada de función como sizeof(stud)
.
He estado buscando en Internet durante meses, no pude encontrarlo (preguntado en un par de foros, sin respuestas).
javascript
memory
object
sizeof
usuario4642212
fuente
fuente
Respuestas:
He refactorizado el código en mi respuesta original . Eliminé la recursión y eliminé la supuesta existencia por encima.
fuente
"よんもじ".length
es 4 en Javascript, pero ¿está seguro de que tiene 8 bytes, ya que su código lo devuelve?var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)
, aquíb
tiene referencia aa
, peroroughSizeOfObject()
regresa0
.Google Chrome Heap Profiler le permite inspeccionar el uso de la memoria de objetos.
Debe poder ubicar el objeto en la traza, lo que puede ser complicado. Si fija el objeto a la ventana global, es bastante fácil de encontrar desde el modo de listado "Contención".
En la captura de pantalla adjunta, creé un objeto llamado "testObj" en la ventana. Luego lo ubiqué en el generador de perfiles (después de hacer una grabación) y muestra el tamaño completo del objeto y todo lo que contiene en "tamaño retenido".
Más detalles sobre los desgloses de memoria .
En la captura de pantalla anterior, el objeto muestra un tamaño retenido de 60. Creo que la unidad es bytes aquí.
fuente
comparison
vista en la parte inferior. Hace obvio qué objetos se crearon entre las dos instantáneas.Shallow size
parece 40 para ambos objetos{ a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }
y{ c:null, d:undefined }
. ¿Está bien?node --inspect
y en Chrome, ingreseabout:inspect
en la barra de URL y busque abrir el inspector de nodos. Cree su objeto en la CLI del nodo y luego tome una instantánea del montón.Acabo de escribir esto para resolver un problema similar (ish). No hace exactamente lo que está buscando, es decir, no tiene en cuenta cómo el intérprete almacena el objeto.
Pero, si está utilizando V8, debería darle una aproximación bastante correcta, ya que los impresionantes prototipos y las clases ocultas absorben la mayor parte de la sobrecarga.
fuente
A veces lo uso para marcar objetos realmente grandes que podrían ir al cliente desde el servidor. No representa la huella en memoria. Simplemente le da aproximadamente lo que costaría enviarlo o almacenarlo.
También tenga en cuenta que es lento, solo para desarrolladores. Pero para obtener una respuesta aproximada con una línea de código me ha sido útil.
fuente
VM1409:1 Uncaught TypeError: Converting circular structure to JSON
:( sigue siendo útil, sin embargoAquí hay una solución un poco más compacta para el problema:
fuente
typeof ...
no funcionaría.Hay un módulo NPM para obtener el tamaño del objeto , puede instalarlo con
npm install object-sizeof
fuente
Este es un método hacky, pero lo intenté dos veces con diferentes números y parece ser consistente.
Lo que puede hacer es tratar de asignar una gran cantidad de objetos, como uno o dos millones de objetos del tipo que desee. Coloque los objetos en una matriz para evitar que el recolector de basura los libere (tenga en cuenta que esto agregará una ligera sobrecarga de memoria debido a la matriz, pero espero que esto no importe y además si se va a preocupar de que los objetos estén en la memoria , los guardas en alguna parte). Agregue una alerta antes y después de la asignación y en cada alerta verifique cuánta memoria está tomando el proceso de Firefox. Antes de abrir la página con la prueba, asegúrese de tener una nueva instancia de Firefox. Abra la página, observe el uso de memoria después de que se muestre la alerta "antes". Cierre la alerta, espere a que se asigne la memoria. Reste la nueva memoria de la anterior y divídala por la cantidad de asignaciones.
Intenté esto en mi computadora y el proceso tenía 48352K de memoria cuando se mostró la alerta "antes". Después de la asignación, Firefox tenía 440236K de memoria. Para 2 millones de asignaciones, esto es aproximadamente 200 bytes para cada objeto.
Lo intenté nuevamente con 1 millón de asignaciones y el resultado fue similar: 196 bytes por objeto (supongo que los datos adicionales en 2 millones se usaron para la matriz).
Entonces, aquí hay un método hacky que podría ayudarte. JavaScript no proporciona un método "sizeof" por una razón: cada implementación de JavaScript es diferente. En Google Chrome, por ejemplo, la misma página usa aproximadamente 66 bytes para cada objeto (a juzgar por el administrador de tareas al menos).
fuente
Lo siento, no pude comentar, así que solo continúo el trabajo de tomwrong. Esta versión mejorada no contará el objeto más de una vez, por lo tanto, no habrá bucle infinito. Además, creo que la clave de un objeto también debe contarse, aproximadamente.
fuente
typeof value === 'object'
no es suficiente y tendrá excepciones si el valor esnull
.level
contiene datos peroroughSizeOfObject(level)
devuelve cero. (Mi nivel variable no debe confundirse con su argumento, por supuesto. No creo que el sombreado variable deba causar un problema aquí, y también cuando cambio el nombre del 'nivel' en su script obtengo el mismo resultado). : snipboard.io/G7E5yj.jpgTener el mismo problema Busqué en Google y quiero compartir con la comunidad stackoverflow esta solución.
Importante :
¿Qué piensa usted al respecto?
fuente
A continuación de este comentario, esto es lo que debe hacer: Intente generar un problema de memoria: escriba un código que cree todos estos objetos y aumente gradualmente el límite superior hasta que se encuentre con un problema (bloqueo del navegador, bloqueo del navegador o falta de disponibilidad) error de memoria). Idealmente, debe repetir este experimento con diferentes navegadores y diferentes sistemas operativos.
Ahora hay dos opciones: opción 1: no logró generar el problema de memoria. Por lo tanto, no te preocupas por nada. No tiene un problema de memoria y su programa está bien.
opción 2: tienes un problema de memoria. Ahora pregúntese si el límite en el que ocurrió el problema es razonable (en otras palabras: es probable que esta cantidad de objetos se cree con el uso normal de su código). Si la respuesta es 'No', entonces estás bien. De lo contrario, ahora sabe cuántos objetos puede crear su código. Vuelva a trabajar el algoritmo de modo que no viole este límite.
fuente
Si su principal preocupación es el uso de memoria de su extensión de Firefox, le sugiero que consulte con los desarrolladores de Mozilla.
Mozilla proporciona en su wiki una lista de herramientas para analizar pérdidas de memoria .
fuente
Esta biblioteca Javascript
sizeof.js
hace lo mismo. Inclúyalo asíLa función sizeof toma un objeto como parámetro y devuelve su tamaño aproximado en bytes. Por ejemplo:
La función sizeof puede manejar objetos que contienen múltiples referencias a otros objetos y referencias recursivas.
Originalmente publicado aquí .
fuente
Las herramientas para desarrolladores de Chrome tienen esta funcionalidad. Este artículo me pareció muy útil y hace exactamente lo que quieres: https://developers.google.com/chrome-developer-tools/docs/heap-profiling
fuente
¡Muchas gracias a todos los que han estado trabajando en el código para esto!
Solo quería agregar que he estado buscando exactamente lo mismo, pero en mi caso es para administrar un caché de objetos procesados para evitar tener que volver a analizar y procesar objetos de llamadas ajax que pueden o no haber sido almacenadas en caché por el navegador Esto es especialmente útil para objetos que requieren mucho procesamiento, generalmente cualquier cosa que no esté en formato JSON, pero puede ser muy costoso mantener estas cosas en caché en un proyecto grande o una aplicación / extensión que se deja en funcionamiento durante mucho tiempo hora.
De todos modos, lo uso para algo como:
Es un ejemplo simplista y puede tener algunos errores, pero da la idea, ya que puede usarlo para retener objetos estáticos (el contenido no cambiará) con cierto grado de inteligencia. Esto puede reducir significativamente los costosos requisitos de procesamiento que el objeto tuvo que ser producido en primer lugar.
fuente
fuente
Utilizo la pestaña Línea de tiempo de las herramientas de desarrollo de Chrome , instancia cada vez más grandes cantidades de objetos y obtengo buenas estimaciones como esa. Puede usar html como este a continuación, como repetitivo, y modificarlo para simular mejor las características de sus objetos (número y tipos de propiedades, etc.). Es posible que desee hacer clic en el icono de bit de basura en la parte inferior de esa pestaña de herramientas de desarrollo, antes y después de una ejecución.
Instanciar 2 millones de objetos de una sola propiedad cada uno (como en este código anterior) conduce a un cálculo aproximado de 50 bytes por objeto, en mi Chromium, en este momento. Cambiar el código para crear una cadena aleatoria por objeto agrega unos 30 bytes por objeto, etc. Espero que esto ayude.
fuente
Si necesita verificar programáticamente por aprox. tamaño de los objetos también puede consultar esta biblioteca http://code.stephenmorley.org/javascript/finding-the-memory-usage-of-objects/ que he podido usar para el tamaño de los objetos.
De lo contrario, sugiero usar Chrome / Firefox Heap Profiler.
fuente
Creo que olvidó incluir 'array'.
fuente
Yo sé que esto no es absolutamente la manera correcta de hacerlo, sin embargo it've me ayudó un par de veces en el pasado para obtener el tamaño de archivo de objeto aprox:
Escriba su objeto / respuesta en la consola o en una nueva pestaña, copie los resultados en un nuevo archivo de bloc de notas, guárdelo y verifique el tamaño del archivo. El archivo del bloc de notas en sí es de unos pocos bytes, por lo que obtendrá un tamaño de archivo de objeto bastante preciso.
fuente