2011-12-21 13 views
5

Actualmente estoy aprendiendo los conceptos de memoria de java, la pila y el montón, sé que las variables locales y las llamadas a métodos vivían en un lugar llamado pila. y los objetos vivieron dentro de un montón. pero ¿y si esa variable local contiene un objeto? o tiene una referencia de objeto?Java Dónde hacen Variables locales, referencias a objetos, variables de instancia

public void Something(){ 
     Duck d = new Duck(24); 
} 

¿Todavía vive dentro de una pila? y dónde viven las variables de instancia? por favor, mantenlo lo más simple posible. gracias.

Respuesta

11

La variable local d (asignada en la pila) contiene una referencia a un objeto de la clase Duck. En general, los objetos se asignan en el montón.

Java 6e14 agregó soporte para algo llamado 'análisis de escape'. Cuando lo habilita con el interruptor -XX:+DoEscapeAnalysis, entonces si JVM determina que un objeto se crea en un método, se usa solo en ese método y no hay forma de que el objeto se "escape" de ese método, es decir, podemos estar seguros que el objeto no se referencia después de que el método se complete - JVM puede asignarlo en la pila (tratando todos sus campos como si fueran variables locales). Esto probablemente suceda en tu ejemplo.

Los campos se asignan con el resto del objeto, por lo tanto en el montón o en la pila, según los resultados del análisis de escape.

+0

asignado dentro del objeto en el que se encuentran? o como en solitario en el montón? – KyelJmD

+0

¿Qué ocurre si el objeto se crea como una variable de instancia si todavía estuviera bajo el análisis de Escape? – KyelJmD

+0

el diseño de un objeto en la memoria es así: encabezado de 8 bytes y luego los atributos. Si la variable de instancia es un Objeto, no una primitiva, entonces solo el puntero se almacena en un bloque continuo de memoria, y el objeto puede asignarse a otra parte. – socha23

2

Variables de referencia de objeto funcionan. al igual que las variables primitivas: si la referencia se declara como una variable local, pasa al stack.else si refrence es la variable de instancia, irá al montón dentro de un objeto.

Cuestiones relacionadas