2011-01-31 18 views
73

Primero, ¿cuál es la diferencia entre el espacio Perm y el espacio Heap (¿Qué y cómo elige la JVM usar cada espacio de memoria)?Perm espacio vs Heap space

En segundo lugar, pero lo más importante, ¿qué tipo de relación se recomendaría para una aplicación java tipo MVC estándar?

Respuesta

75

El montón almacena todos los objetos creados por su programa Java. El contenido del montón es supervisada por el recolector de basura, lo que libera memoria del montón cuando deje de usar un objeto (es decir, cuando no hay más referencias al objeto.

Esto está en contraste con el pila, que almacena tipos primitivos como enteros y carbones de leña, y son variables típicamente locales y los valores de retorno de función Estos no son basura recogida

el espacio perm se refiere a una parte especial de la pila Ver esta respuesta para una explicación:... What is perm space?

+1

El enlace que usted dio dice "segmento del montón", ¿realmente es "una parte especial de la pila"? Tendría mucho más sentido que sea una parte del montón (o incluso algún tipo de segmento de datos estáticos) en lugar de la pila que simplemente no es adecuada para ese tipo de cosas. –

+1

Es una parte especial del montón. Edité mi respuesta antes de comentar, pero aprecio la corrección de todos modos :) – Olhovsky

+1

¿Alguna recomendación sobre la segunda pregunta? – Gareth

33

Per En términos generales, no consideraría a PermGen como una parte especial del montón.

Prefiero pensar en heap como un área de memoria dedicada a almacenar instancias de objetos mientras que PermGen es un área dedicada a las definiciones de clase de tienda. Como resultado, el ciclo de vida de un montón está vinculado a una aplicación, mientras que el ciclo de vida de PermGen está vinculado a una JVM.

Uno de los mejores ejemplos de por qué una aplicación y su JVM pueden tener un ciclo de vida diferente se encuentra en un contenedor Java EE. En un servidor de aplicaciones, las aplicaciones se pueden implementar y deshacer sin reiniciar el servidor. Durante la desinstalación (o reasignación), es fácil liberar todas las instancias de objetos, es decir, el espacio dinámico, pero es bastante complicado borrar todas las clases cargadas por esta aplicación desde PermGen porque la JVM aún puede hacer referencia a algunas de las clases.

Uno de estos casos es el Leaking Drivers. Cuando se implementa una aplicación, se carga un controlador JDBC y se registra con DriverManager. Cuando esta aplicación no está desplegada, el DriverManager permanece encendido y contiene una referencia al controlador, su cargador de clases original y todo lo que este cargador de clases cargó. Como resultado, se crea una pérdida de memoria en PermGen, pero no es culpa de la administración de la memoria de la aplicación.

Es cierto que las JVM como JRocket no tienen PermGen en absoluto, todo está almacenado en el montón. Solo en ese contexto puede llamar a PermGen una "parte especial" de Heap. Incluso entonces, aún deberíamos ver PermGen y Heap de forma diferente ya que tienen un propósito muy diferente y tienen tipos muy diferentes de pérdidas de memoria.

Actualización: En Oracle JDK 8, PermGen es replaced by "Metaspace" y ahora es oficialmente parte del montón. No necesitaremos sintonizar PermGen específicamente más.

0

NO puede dar nombres a la memoria asignada en el montón.

Eso significa que int x (su nombre) está asignado en la pila. Puede llegar al puntero por su nombre, por lo que el puntero está en la pila. No puede alcanzar el objeto por su nombre, porque no tiene nombre. Los accesos al objeto (sin nombre) deben ser por su puntero.

Cuestiones relacionadas