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.
fonte
2015-05-16 01:19:45