¿Dónde se asigna la referencia variable, en la stack o en el montón?

tengo una pregunta

Qué sucedió cuando declaro una variable dentro de un método, por ejemplo.

 void myMethod () {
     Ship myShip = new Ship ();
 }

¿Dónde se asigna la referencia de myShip, en stack o en el montón?

Creo que en stack pero estoy confundido porque estaba leyendo en el libro de J2ME Game Programming “las clases de Java se crean instancias en el montón de Java”

¿Todas las clases de Java?

Gracias por adelantado

myShip es una referencia a un objeto Ship , myShip está en la stack de llamadas al método, que se conoce como “la stack”. Cuando se llama un método, un bloque de memoria se coloca en la parte superior de la stack, ese bloque de memoria tiene espacio para todas las primitivas (int, float, boolean, etc.) y las referencias de objeto del método, que incluye los parámetros del método. El montón es donde se asigna la memoria para los objetos reales.

Entonces myShip está en la stack y el objeto Ship está en el montón.

Tenga en cuenta que cada hilo tiene su propia stack pero comparte el montón.

Java realmente hace las cosas un poco diferente. La referencia está básicamente en la stack. La memoria para el objeto se asigna en lo que pasa para el montón. Sin embargo, la implementación de memoria asignable no es exactamente como la forma en que se implementa el montón en el modelo C / C ++.

Cuando crea un objeto nuevo como ese, efectivamente coloca el nombre en la tabla de referencias para ese scope. Eso es muy parecido a un puntero a un objeto en C ++. Cuando sale del scope, esa referencia se pierde; la memoria asignada ya no se referencia y se puede recolectar basura.

Actualmente, todos los objetos Java se asignan en el montón. Se habla de que Java 7 podría hacer un análisis de escape y ser capaz de asignar en la stack, pero no sé si la propuesta ya está finalizada. Aquí está el RFE .

Editar: Aparentemente, ya está en versiones iniciales de JDK 7 . (El artículo dice que también estará en JDK 6u14, pero no puedo encontrar la confirmación).

En teoría, el objeto continúa “el montón”. Entonces, como es una referencia local de método, la referencia real estará en la stack. Por “la” stack, nos referimos a la stack de subprocesos nativa (es decir, la misma stack en la que se asignaría una variable local en C) en el caso de la VM de Sun al menos, pero no creo que sea realmente un requisito (la JVM solo tiene que tener una noción abstracta de “marcos de stack” que asigna en cada llamada a método, ya sea desde la stack nativa o no).

Pero … en las máquinas virtuales modernas (con la posible excepción de las máquinas virtuales integradas / mpbile), en realidad no existe el “montón”. En la práctica, hay varias áreas de montón. El más simple de estos es típicamente casi como un “mini stack”, diseñado para ser rápido de asignar para objetos que no se mantendrán por mucho tiempo y probablemente puedan ser asignados casi de inmediato.

Como se menciona en otro póster, una JVM altamente optimizada podría, en principio, asignar datos de objeto en la stack y hay propuestas definitivas para esto. Aunque, como también se menciona en una de las referencias, una crítica de esto es que el montón rápido “eden” es casi como una stack de todos modos (simplemente no “la” stack).