2013-10-17 10 views
5

Quando dico qualcosa come:Dove viene creato l'oggetto thread? Stack o Heap?

Thread t1 = new Thread(); 

vuol crearlo su un mucchio o di una pila?

+0

La parte "visibile" si trova nell'heap JVM. C'è anche, per un thread in esecuzione, almeno una parte specifica del sistema operativo allocata altrove, ma viene gestita automaticamente. –

risposta

7
Thread t1 = new Thread(); 

Questo alloca l'oggetto vale a dire t1 in heap.

Come ogni nuovo thread esiste, ottiene il proprio registro del pc (contatore del programma) e stack Java. Se il thread sta eseguendo un metodo Java (non un metodo nativo), il valore del registro pc indica la prossima istruzione da eseguire. Lo stack Java di un thread memorizza lo stato di invocazioni del metodo Java (non nativo) per il thread. Lo stato di una chiamata al metodo Java include its local variables, the parameters with which it was invoked, its return value (se presente), and intermediate calculations. Lo stato delle invocazioni del metodo nativo è memorizzato in modo dipendente dall'implementazione in stack di metodi nativi, nonché possibilmente in registri o altre aree di memoria dipendenti dall'implementazione.

Lo stack Java è composto da frame stack (o frame). Una cornice dello stack contiene lo stato di una chiamata al metodo Java. Quando un thread richiama un metodo, la Java virtual machine inserisce un nuovo frame nello stack Java di quel thread. Al termine del metodo, la macchina virtuale si apre e scarta la cornice per quel metodo.

La macchina virtuale Java non ha registri per contenere valori di dati intermedi. Il set di istruzioni utilizza lo stack Java per la memorizzazione di valori di dati intermedi.

La figura mostra un'istantanea di un'istanza di macchina virtuale in cui sono in esecuzione tre thread. All'istante dell'istantanea, i thread uno e due stanno eseguendo metodi Java. La discussione tre sta eseguendo un metodo nativo. Mostra anche le aree di memoria create dalla macchina virtuale Java per ogni thread, queste aree sono private del thread proprietario. Nessun thread può accedere al registro del pc o allo stack Java di un altro thread.

enter image description here

+0

grazie @Prova! Ma potrebbe spiegarmi che cos'è un metodo nativo del thread? e questo declassamento: "Lo stato delle invocazioni del metodo nativo è memorizzato in modo dipendente dall'implementazione in stack di metodi nativi, nonché possibilmente in registri o altre aree di memoria dipendenti dall'implementazione." – Chiran

+1

se un thread esegue un'operazione nativa, roba jni. E per l'altra domanda significa che differisce l'implementazione in termini di thread e allocazione dello spazio. – Trying

+0

Ciao, Si prega di chiarire se nativo include chiamata API livello SO? Come per l'invocazione dei metodi read(), write() in Java I/O. –

10

Non esiste alcun modo per allocare oggetti nello stack in Java.
Lo stack può contenere solo riferimenti e primitive e solo per variabili locali.

Si noti che l'avvio di una discussione creerà un nuovo stack per quella discussione.

+2

+1 Per essere più specifici, l'oggetto 'Thread' e i suoi campi sono allocati nell'heap. La memoria dello stack associata al nuovo thread viene allocata da JVM/OS, ma questo è _non_ sull'heap. È allocato in una diversa sezione della memoria. – Gray

+0

Non è possibile allocare oggetti nello stack esplicitamente ma la JVM può allocare oggetti sullo stack come ottimizzazione se sono abbastanza piccoli e non stanno sfuggendo al thread corrente. Vedere questo articolo nella sezione "Assegnazione dello stack": http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html – dcernahoschi

+0

Nota: Java 7/8 consente di posizionare gli oggetti sullo stack. –

2

In Java 8, utilizzando oggetti di Analysis di fuga possono essere creati in pila. Ciò si verifica quando viene rilevato un oggetto che non esegue l'escape del metodo corrente (dopo che è stata eseguita l'inlining) Nota: questa ottimizzazione è disponibile in Java 7, ma non penso che abbia funzionato altrettanto bene.

Tuttavia, non appena si chiama start(), il metodo corrente verrà sfuggito, quindi deve essere posizionato nell'heap.

Quando dico qualcosa come:

Thread t1 = new Thread(); 

vuol crearlo su un mucchio o di una pila?

Potrebbe metterlo in pila, purché non lo si usi per creare un thread reale. Ad esempio:

Thread t1 = new Thread(runnable); 
t1.start(); 

Deve posizionarlo sullo heap.

Problemi correlati