Recientemente escribí 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 el código mucho más complejo. Esto aumentó el tamaño del archivo compilado .class
por ~ 10 KB.¿Cómo calculo el consumo total de memoria permgen de una clase?
Supongo que la JVM tiene que cargar el archivo .class
en la memoria, por lo que estos cambios no se amortizarán a menos que haya 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 , solo, el costo de la mayor complejidad del código.
This Oracle blog sugiere que hay una buena cantidad de memoria adicional consiguiendo consumido por la clase en el PermGen que no sólo se basa en el archivo .class
- por ejemplo, sospecho que el código más complejo puede requerir más memoria para la optimización de metadatos .
Por lo tanto, esta pregunta tiene dos partes:
- ¿Cómo puedo medir el consumo de memoria PermGen real de una clase en particular? ¿Ya sea en tiempo de ejecución con algunos instrumentos 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 some background knowledge, se puede estimar el consumo de memoria de las instancias de clase a medida que los va a escribir; me pregunto si se puede estimar el consumo de memoria PermGen de la propia clase.)
detalles similares para la máquina virtual Dalvik sería apreciado, pero estoy enfocado principalmente en OpenJDK y las otras JVM "mainstream".
de perfiles podría ayudar –
requisitos de memoria también dependerá de si HotSpot lo compila. El código JITed tiene su propio costo. –
@JesseWilson: Esto es claramente cierto, pero ¿hay una buena manera de estimar ese costo? ¿Es solo el consumo del ensamblaje sin procesar, o hay mucha contabilidad adicional? –