2011-12-21 5 views
5

Attualmente sto imparando i concetti di memoria di java, lo stack e l'heap, so che le variabili locali e le chiamate di metodo hanno vissuto in un posto chiamato stack. e oggetti vissuti dentro un mucchio. ma cosa succede se quella variabile locale contiene un oggetto? o ha un riferimento a un oggetto?Java Dove si trovano Variabili locali, riferimenti a oggetti, variabili di istanza

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

Vive ancora all'interno di uno stack? e dove vivono le variabili di istanza? si prega di mantenere il più semplice possibile. grazie.

risposta

11

La variabile locale d (allocata nello stack) contiene un riferimento a un oggetto della classe Duck. In generale gli oggetti sono allocati nell'heap.

Java 6e14 ha aggiunto il supporto per qualcosa chiamato "analisi di fuga". Quando lo abiliti con lo switch -XX:+DoEscapeAnalysis, allora se JVM determina che un oggetto viene creato in un metodo, usato solo in quel metodo e non c'è modo di fare riferimento all'oggetto per "sfuggire" a quel metodo - cioè, possiamo essere certi che l'oggetto non è referenziato dopo il completamento del metodo - JVM può allocarlo sullo stack (trattando tutti i suoi campi come se fossero variabili locali). Questo probabilmente accadrà nel tuo esempio.

I campi vengono allocati con il resto dell'oggetto, quindi sull'heap o sullo stack, in base ai risultati dell'analisi di escape.

+0

allocati all'interno dell'oggetto in cui si trovano? o come da solo nell'heap? – KyelJmD

+0

E se l'oggetto fosse creato come variabile di istanza, cadrebbe ancora sotto l'analisi di Fuga? – KyelJmD

+0

il layout di un oggetto in memoria è il seguente: 8 byte di intestazione, quindi gli attributi. Se la variabile di istanza è un oggetto, non una primitiva, solo il puntatore viene archiviato nel blocco di memoria permanente e l'oggetto può essere assegnato altrove. – socha23

2

Le variabili di riferimento oggetto funzionano. proprio come le variabili primitive, se il riferimento è dichiarato come variabile locale, va sullo stack.else se refrence è una variabile di istanza andrà nell'heap all'interno di un oggetto.