2014-05-08 10 views
12

Una variabile di istanza di un oggetto in Java è memorizzata nello stack o nell'area del metodo di JVM?Dove sono le variabili di istanza di un oggetto memorizzato nella JVM?

Inoltre, abbiamo una variabile di istanza diversa per più thread?

Se è memorizzato nell'area metodo, come è diversa la variabile di istanza dall'archiviazione di variabili statiche?

+0

variabili di istanza sono uno per ogni oggetto. Le variabili statiche sono una per classe. Thread (sorta di) condividono la stessa memoria –

risposta

16

Pila e mucchio sono le memorie assegnate dal sistema operativo alla JVM che scorre nel sistema . Stack è un luogo di memoria in cui sono memorizzati i metodi e le variabili locali. (riferimenti variabili primitivo o oggetto riferimenti vengono anche memorizzati nello stack). Heap è un luogo di memoria in cui sono memorizzati gli oggetti e la relativa variabile di istanza.

Quindi, per riassumere:

  • oggetti classe, compreso il codice metodo e campi statici: mucchio.
  • Oggetti, inclusi i campi di istanza: heap.
  • variabili locali e le chiamate a metodi: pila

Inoltre, dobbiamo variabile di istanza diverso per più thread?

Ogni thread avrà un contatore di programma (PC) e uno stack java. Il PC utilizzerà lo stack java per memorizzare i valori intermedi, il collegamento dinamico, i valori di ritorno per i metodi e le eccezioni di invio. Questo è usato al posto dei registri.

Anche per ulteriori informazioni su thread, è consigliabile leggere questo argomento Where is Thread Object created? Stack or Heap?.

Se stoccato in zona metodo com'è esempio variabile diversa da immagazzinamento variabile statica?

Come potete vedere sopra campi statici sono memorizzati in mucchio. D'altra parte, le variabili locali vengono memorizzate nello stack.

// EDIT

Secondo i commenti di Bruno Reis e Peter Lawrey, si dovrebbe anche leggere su analisi fuga

  1. Wikipedia
  2. Virtual Machine Performance Enhancements,Escape Analysis
+0

Questo non è strettamente corretto. Le moderne JVM sono molto più complesse e dispongono di algoritmi di ottimizzazione che possono determinare che la memorizzazione di un dato oggetto in una determinata situazione sullo * stack * può portare a prestazioni migliori (ad esempio, meno stress sul GC). Ad esempio, google JVM Escape Analysis. In ogni caso, a meno che non si stia scrivendo qualcosa di veramente di basso livello, non ci si deve preoccupare se qualcosa è archiviato su heap o stack. –

+0

Non sto dicendo che questo è assolutamente corretto. Questa è solo una visione molto semplice di come sono le variabili memorizzate in Java. –

+1

@BrunoReis true, ma l'analisi di escape raramente ha come risultato l'eliminazione dell'heap. –

2

Per essere precisi,

  • Le variabili di istanza verranno archiviate nell'heap.
  • variabili locali nello stack (in caso di variabile non una primitiva [variabile di riferimento] variabili di riferimento in diretta sullo stack
    e l'oggetto su heap). Solo l'invocazione del metodo e i risultati parziali verranno memorizzati nello stack e non nel metodo stesso.
  • Variabili statiche e metodi (inclusi statici e non statici) nell'area di metodo .

Riferimento: Head First Java

Problemi correlati