Esto parece un malentendido común. En JVM de Oracle, la generación permanente no es parte del montón. Es un espacio separado para definiciones de clase y datos relacionados. En Java 6 y versiones anteriores, las cadenas internas también se almacenaban en la generación permanente. En Java 7, las cadenas internas se almacenan en el montón de objetos principal.
Aquí hay un good post on permanent generation.
me gustan las descripciones dadas para cada espacio en guide on JConsole de Oracle:
Para el Java HotSpot VM, la memoria piscinas para la recolección de basura en serie son los siguientes.
- Eden Space (heap): El conjunto desde el que inicialmente se asigna la memoria para la mayoría de los objetos.
- Survivor Space (Heap): el grupo que contiene objetos que han sobrevivido la recolección de basura del espacio Eden .
- Generación sostenida (heap): grupo que contiene objetos que han existido durante algún tiempo en el espacio del superviviente.
- Generación permanente (no acumulativa): el conjunto que contiene todos los datos reflectantes de la máquina virtual en sí, como objetos de clase y método. Con máquinas virtuales Java que utilizan el intercambio de datos de clase, esta generación se divide en áreas de solo lectura y de lectura y escritura.
- caché de código (no apilable): la máquina virtual Java de HotSpot también incluye un caché de código, que contiene la memoria que se utiliza para la compilación y el almacenamiento del código nativo .
Java utiliza la recolección de basura generacional. Esto significa que si tiene un objeto foo (que es una instancia de alguna clase), cuantos más eventos de recolección de basura sobrevivan (si todavía hay referencias a él), más se promueve. Comienza en la generación joven (que a su vez está dividida en espacios múltiples, Edén y Superviviente) y eventualmente terminaría en la generación permanente si sobreviviera lo suficiente.
también relacionado con esta cuestión "generación titular" – gstackoverflow