¿La generación permanente forma parte del montón o se encuentra en un espacio diferente de sí mismo en jvm?
heap permgen (5)
He visto comentarios múltiples con respecto a esta pregunta: algunos dicen que sí y otros dicen que no, y muchas de las respuestas son ambiguas. ¿Alguien puede describir en términos más simples dónde reside? En una publicación, incluso vi a alguien decir que comparte el mismo lugar de memoria que la memoria de clase en la que los cargadores de clases cargan las clases. ¿Es cierto?
Aquí está mi entendimiento del tema:
La generación permanente es la región del montón donde se almacenan las definiciones de clase. Como se muestra en http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation , todas las instancias de clase tienen una referencia ''klass'' a una instancia de la clase de su tipo en la generación permanente. Cuando se crean nuevos tipos en el tiempo de ejecución, se asigna un nuevo espacio en la generación permanente para sus tipos.
El diagrama en la publicación de blog de Jon Masamitsu muestra la separación lógica entre la generación permanente y las partes más reunidas con frecuencia del montón donde se pueden almacenar las instancias de objetos de su programa. La generación permanente todavía es parte del montón.
Desde una perspectiva de Blackbox, en Sun JVMs, Permanent Generation no forma parte del Heap como se indica en la documentación de jconsole
:
Generación permanente (no acumulativa): agrupación que contiene todos los datos reflectantes de la máquina virtual en sí, como objetos de clase y método. Con las máquinas virtuales Java que utilizan el intercambio de datos de clase, esta generación se divide en áreas de solo lectura y lectura y escritura.
En la práctica, esto significa que su memoria -XX:MaxPermSize
suma a su memoria -Xmx
en el proceso de JVM, ya que la generación permanente no se incluye en el montón.
Permgen se elimina de Java 8. Ahora tenemos un metaespacio que no es parte del montón y parte de la memoria interna.
También los comandos -Xmx -XX: MaxPermSize serán ignorados desde Java 8
Me vino la misma pregunta al leer los Fundamentos de Java Garbage Collection , en esta turtorial, el autor ve la generación permanente como parte de Heap.
Pero tenemos ambos:
- -Xmx
- -XX: MaxPermSize
y después de la pregunta de google, encuentro que esto cuestiona la terminología del montón de Java: ¿generaciones jóvenes, viejas y permanentes? , respuestas de las cuales concluye:
la generación permanente no es parte del montón
Respuesta original (quizás errónea): si se debe creer en wikipedia , es parte del montón.
Editar: He examinado este tema más, incluido el sitio al que hace referencia el OP en un comentario. Durante esta investigación me encontré con esta pregunta SO , que hace referencia a este documento , que indica que para Sun Java (versión 6), la colección permanente está realmente fuera del montón. Dicho esto, no soy un experto en Java y no estaba al tanto de los detalles de administración de memoria en este nivel. Si mi lectura es correcta, la ubicación, o incluso la existencia, de la generación permanente es un detalle de implementación de jvm.