2015-05-16 13 views
6

Se ho capito bene lo stack è per primitive locali e riferimenti agli oggetti nell'heap. Quindi cosa succede se hai più di un thread?C'è uno spazio di stack per ogni thread?

Condivide lo stesso spazio di stack contemporaneamente (ma aree diverse) oppure i contesti dell'interruttore JRE e carica il carico del contenuto dello stack quando si passa da un thread all'altro?

Oppure il JRE alloca stack separati per ogni thread?

risposta

2

Ogni thread ha il proprio stack che contiene un frame per ogni metodo eseguito su quel thread, come si può vedere here nella sezione "Per Thread".

2

Oppure la JRE allocare pile separate per ogni thread?

Sì. The JVM is specified to do so:

Ogni Java Virtual Machine filo ha un privato Java Virtual Machine pila, creato allo stesso tempo come filo. Uno stack Java Virtual Machine memorizza i frame. [...] Poiché lo stack Java Virtual Machine non viene mai manipolato direttamente tranne che per i frame push e pop, i frame possono essere allocati su heap.

4

Oppure la JRE allocare pile separate per ogni thread?

Concettualmente sì. (Vedi questo JVM spec link, per esempio.)

Come la concettualizzazione della specifica viene implementata in una particolare JVM è ... specifica dell'implementazione. Tuttavia, la mia comprensione è che le JVM di generazione corrente (ad esempio Hotspot) allocano ciascuna pila di thread in un blocco di memoria separato richiesto dal sistema operativo; per esempio. utilizzando un syscall mmap .

Non c'è certamente alcuna copia all'ingrosso del contenuto dello stack quando si verifica un cambio di thread. Tuttavia, il cambio di contesto dei thread comporta il salvataggio e il caricamento dei registri, e (indirettamente) un carico aggiuntivo sulla memoria cache e sulle voci TLB. Questo può essere significativo ... ed è il motivo per cui interruzioni eccessive del contesto dei thread (ad esempio causate da conflitti di blocco o eccessiva attesa/notifica) possono essere dannose per le prestazioni.


1 - Il mio ricordo è che alcuni JVM includono una sola lettura pagina "red-zone" alla fine di ogni segmento di stack. (Ciò significa che l'overflow dello stack di thread innesca un errore di memoria, e la JVM non ha bisogno di verificare esplicitamente l'overflow dello stack su ogni chiamata al metodo, il che sarebbe un notevole impatto sulle prestazioni.) Comunque, la mia comprensione è che la "zona rossa" "pagina richiede gli stack di thread da richiedere utilizzando mmap.

1

I thread Java sono rappresentati da oggetti thread, a ogni thread è assegnato uno stack di thread separato utilizzato per la memorizzazione dei dati di runtime. La pila di thread ha una dimensione specifica (può essere impostata utilizzando l'opzione VM java -Xss1m Application).

Se durante il runtime, il thread tenta di memorizzare più date rispetto alla dimensione dello stack consentito, si verifica un errore di overflow dello stack.