¿Cómo calculo el consumo total de memoria permgen de una clase?

Recientemente, estaba escribiendo una clase en la que descubrí que podía reducir el consumo de memoria de las instancias en ~10 bytes/elemento, pero solo a costa de hacer que el código fuera mucho más complejo. Esto aumentó el tamaño del compilado. .class archivo por ~ 10 KB.

Supongo que la JVM tiene que cargar el .class archivo en la memoria, por lo que estos cambios no se amortizarían a menos que hubiera al menos 1000 elementos más o menos. Pero esa aritmética no funciona a menos que los 10 KB adicionales en el archivo de clase sean los , solamente costo de la mayor complejidad del código.

Este blog de Oracle sugiere que hay una buena cantidad de memoria adicional consumida por la clase en el permgen que no solo se basa en el .class archivo; por ejemplo, sospecho que un código más complejo podría requerir más memoria para optimizar los metadatos.

Entonces, esta pregunta tiene dos partes:

  • ¿Cómo puedo medir el consumo real de memoria permgen de una clase en particular? ¿En tiempo de ejecución con alguna instrumentación o con herramientas de creación de perfiles?
  • ¿Hay alguna manera de estimar el consumo de memoria permgen de la clase mientras la escribo? (Con algunos conocimientos previos, puede estimar el consumo de memoria de las instancias de clase a medida que las escribe; Me pregunto si podemos estimar el consumo de memoria permgen de la clase en sí).

Se agradecerían detalles similares para la VM de Dalvik, pero me enfoco principalmente en OpenJDK y las otras JVM "principales".

preguntado el 11 de junio de 12 a las 19:06

Los requisitos de memoria también dependerán de si HotSpot lo compila. El código JITed tiene su propio costo. -

@JesseWilson: Esto es claramente cierto, pero ¿existe una buena manera de estimar ese costo? ¿Es solo el consumo del ensamblaje en bruto, o hay mucha contabilidad adicional? -

Puedo decir algo extraño, pero dado que XXX.class es una instancia de Class, ¿no podemos usar el mismo método que usamos para las instancias normales? ¿Te gusta el método getObjectSize del agente Java? Pero tal vez no incluya los "metadatos de optimización" de los que habla:

2 Respuestas

¿Cómo puedo medir el consumo real de memoria permgen de una clase en particular? ¿En tiempo de ejecución con alguna instrumentación o con herramientas de creación de perfiles?

Un enfoque podría ser cargar la clase para medir en un cargador de clases diferente y usar jmap -permstat como se presenta en este Entrada de blog.

Para cada objeto de cargador de clases, se imprimen los siguientes detalles:

  1. La dirección del objeto del cargador de clases, en la instantánea cuando se ejecutó la utilidad.
  2. El número de clases cargadas (definido por este cargador con el método (java.lang.ClassLoader.defineClass).
  3. El número aproximado de bytes consumidos por metadatos para todas las clases cargadas por este cargador de clases.
  4. La dirección del cargador de clases principal (si existe).
  5. Una indicación de "vivo" o "muerto": indica si el objeto del cargador será recolectado como basura en el futuro.
  6. El nombre de clase de este cargador de clases.

Respondido el 12 de junio de 12 a las 12:06

Oooooh. Voy a investigar esto. - Luis Wassermann

@LouisWasserman: ¿consiguió más información después de investigar? - dimo414

Esta es una respuesta a su segundo punto; No estoy seguro de cuán útil sería esto, pero encontré las diapositivas en la presentación. Creación de aplicaciones Java eficientes en memoria: prácticas y desafíos ser bastante útil para estimar el tamaño y la salud de varios objetos Java. Entra en muchos detalles al estimar los tamaños de los objetos en JVM de 32 bits y 64 bits, y también proporciona sugerencias para hacer que su objeto sea más eficiente en memoria.

Respondido el 11 de junio de 12 a las 19:06

De hecho, esa presentación es lo que me motivó a intentar escribir la implementación más compleja, pero más eficiente en memoria por elemento, pero ahora me pregunto si realmente podría haber empeorado el problema. ;) - Luis Wassermann

@LouisWasserman No necesariamente peor, pero tal vez un poco más complicado. :) - vivin paliath

Bueno... si nunca hay más de 1000 elementos en las instancias de la memoria, parece probable que is peor. - Luis Wassermann

@LouisWasserman ¡Pensé que estabas hablando de tu código! Pero sí, estoy de acuerdo. - vivin paliath

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.