Pregunta

He estado leyendo últimamente mucho en los esquemas de asignación de memoria en Java, y ha habido muchas dudas ya que he estado leyendo a partir de diversas fuentes. He recogido mis conceptos, y pediría a pasar por todos los puntos y hacer comentarios sobre ellos. Llegué a conocer que la asignación de memoria es JVM específica, por lo que hay que decir de antemano, que mi pregunta es Sun específica.

  1. clases (cargados por los cargadores de clases) ir en una zona especial en el montón: Generación Permanente
  2. Toda la información relacionada con una clase como nombre de la clase, las matrices de objetos asociados a la clase, los objetos internos utilizados por JVM (como java / lang / Object) y la información de optimización entra en el área de generación permanente.
  3. Todas las variables miembro estáticas se mantienen en el área de generación permanente de nuevo.
  4. Los objetos van en un montón diferente: la generación joven
  5. Hay solamente una copia de cada método por clase, ser el método estático o no estático. Esa copia se coloca en el área de Generación Permanente. Para los métodos no estáticos, todos los parámetros y variables locales van a la pila - y cada vez que hay una invocación concreta de ese método, se obtiene una nueva pila de fotograma asociado a él. No estoy seguro de dónde están las variables locales de un método estático están almacenados. Están en el montón de Generación Permanente? O simplemente su referencia se almacena en el área de Generación Permanente, y la copia real es en otro lugar (¿dónde?)
  6. También estoy seguro de dónde viene el tipo de retorno de un método se almacenan.
  7. Si los objetos (en la generación joven) necesita usar un miembro estático (en la generación permanente), se les da una referencia al miembro estático && se les da suficiente espacio de memoria para almacenar el tipo de retorno del método, etc.

Gracias por pasar por esto!

¿Fue útil?

Solución

En primer lugar, como debe ser claro para usted por ahora que hay muy pocas personas que pueden confirmar estas respuestas de primera mano. Muy pocas personas han trabajado en la reciente HotSpot JVM o los estudió a la profundidad necesaria para saber realmente. La mayoría de la gente aquí (me incluyo) están respondiendo basan en cosas que han visto escrito en otra parte, o lo que han inferido. Por lo general, lo que está escrito aquí, o en artículos y páginas web diferentes, se basa en otras fuentes que pueden o no ser definitiva. A menudo se simplifica, mal inexacta o simplemente.

Si desea confirmación definitiva de sus respuestas, que realmente necesita para descargar el código fuente OpenJDK ... y hacer su propia investigación por leer y comprender el código fuente. Hacer preguntas sobre SO, o arrastre a través de artículos de la tela al azar no es una técnica de investigación académica sólida.

Una vez dicho esto ...

  

1) Clases (cargado por los cargadores de clases) ir en una zona especial en el montón:. Generación Permanente

Que yo sepa, sí. ( Actualizar . Ver más abajo)

  

2) Toda la información relacionada con una clase como nombre de la clase, las matrices de objetos asociados a la clase, los objetos internos utilizados por JVM (como java / lang / Object) y la información de optimización entra en el área de generación permanente.

Más o menos, sí. No estoy seguro de lo que entendemos por algunas de esas cosas. Supongo que los "objetos internos utilizados por JVM (como java / lang / Object)" significa JVM-interno descriptores de clase.

  

3) Todas las variables miembro estáticas se mantienen en el área de generación Permanente de nuevo.

Las variables a sí mismas. Estas variables (como todas las variables de Java) llevará a cabo, ya sea los valores primitivos o referencias a objetos. Sin embargo, mientras que las variables miembro estático están en un marco que se asigna en el montón PermGen, los objetos / las matrices mencionadas por esas variables se pueden asignar en cualquier montón.

  

4) Objetos van en un montón diferente: generación joven

No necesariamente. Los objetos grandes pueden asignarse directamente en la generación titular.

  

5) Hay solamente una copia de cada método por clase, ser el método estático o no estático. Esa copia se coloca en el área de Generación Permanente.

Si se asume que se está refiriendo al código del método, entonces yo sepa sí. Puede ser un poco más complicado sin embargo. Por ejemplo que el código puede existir en el código de bytes y / o formas de código nativo en diferentes momentos de la vida de la JVM.

  

... Para los métodos no estáticos, todos los parámetros y variables locales van a la pila - y cada vez que hay una invocación concreta de ese método, se obtiene una nueva pila de fotograma asociado a él.

Sí.

  

... No estoy seguro de dónde están las variables locales de un método estático están almacenados. Están en el montón de Generación Permanente? O simplemente su referencia se almacena en el área de Generación Permanente, y la copia real es en otro lugar (¿dónde?)

No. Se almacenan en la pila, al igual que las variables locales en los métodos no estáticos.

  

6) También estoy seguro de dónde viene el tipo de retorno de un método se almacenan.

Si se refiere a la valor que devuelve una lista (no nula) llamada al método, entonces se devuelve, ya sea en la pila o en un registro de la máquina. Si se devuelve a la pila, esto lleva 1 o dos palabras, dependiendo del tipo de retorno.

  

7) Si los objetos (en la generación joven) Nees para utilizar un miembro estático (en la generación permanente), se les da una referencia al miembro estático && se les da suficiente espacio de memoria para almacenar el tipo de retorno de la método, etc.

Eso es inexacta (o al menos, no se están expresando con claridad).

Si algún método accede a una variable miembro estática, lo que recibe es o bien un valor primitivo o un objeto referencia . Esto puede ser asignado a un (existente) variable local o parámetro, asignado a un miembro estático o no estático (existente), asignado a un elemento (existente) de una matriz previamente asignado, o simplemente usa y se desecha.

  • En ningún caso el nueva necesidad de almacenamiento, que se asignarán a suscribir una referencia o un valor primitivo.

  • Típicamente, una palabra de la memoria es todo lo que se necesita para almacenar una referencia de objeto o matriz, y un valor primitivo ocupa típicamente una o dos palabras, dependiendo de la arquitectura hardware.

  • En ningún caso necesitan espacio para ser asignada por la persona que llama para sostener un objeto / matriz devuelta por un método. En Java, objetos y arrays siempre son devueltos usando semántica pase por valor ... pero que valor que se se devuelve es una referencia de objeto o matriz.

Actualizar

A partir de Java 8, el espacio PermGen ha sido sustituido por metaespacio. Para obtener más información, consulte los siguientes recursos:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top