L'allocazione dello stack dipende dall'implementazione Java?

1

Ho esaminato i diversi thread e ci sono molte informazioni contrastanti là fuori. L'articolo più utile che ho trovato è stato questo: teoria e pratica Java: leggende sul rendimento urbano, rivisitate ma è del 2005.

Quindi mi chiedevo quale sia lo stato dello standard Java per quanto riguarda l'allocazione dell'heap. Nelle note di rilascio per Java 7 dice:

(The server compiler) does not replace a heap allocation with a stack allocation for non-globally escaping objects.

Ho avuto l'impressione dall'altro articolo che questo è effettivamente possibile fare nel compilatore, ma sembra non essere richiesto dallo standard.

Una domanda correlata che non sembra rispondere alla mia domanda è Stack e Memoria heap in Java La risposta accettata per questa domanda dice che solo le primitive possono essere messe in pila. Non sembra esserci alcun consenso al riguardo. In secondo luogo, sto ovviamente facendo una domanda diversa.

Capisco che in Java tutto è un riferimento. Detto questo, un compilatore alloca tutto sull'heap anche se è raggiungibile solo da un riferimento stack?

    
posta starflyer 31.01.2016 - 05:15
fonte

1 risposta

4

I was wondering what is the state of the Java standard regarding heap allocation.

Ci vogliono solo un paio di secondi per effettivamente grep del testo della specifica del linguaggio Java per tutte le occorrenze delle parole "stack" o "heap" e ispezionarli, quindi la risposta non è veramente difficile: non lo fa Non dire nulla sull'allocazione dello stack o dell'heap. E perché dovrebbe? Questo è un dettaglio di implementazione.

La grande maggioranza degli hit per "heap" parla di "heap pollution", che è il nome di una condizione che può verificarsi con Java Generics, dove un riferimento di un certo tipo generico può puntare a un oggetto di un diverso genere. Tuttavia, questo è solo un nome che i progettisti di Java hanno trovato, non è necessariamente correlato a un heap.

La maggior parte degli hit per "stack" parla di StackOverflowException . Un hit parla del fatto che le eccezioni asincrone che sono costruite ad un certo punto nel tempo ma solo lanciate molto più tardi possono costruire la traccia dello stack pigramente. Il resto degli hit sono nelle sezioni "esempio", in cui le specifiche parlano di come potrebbe essere implementato.

Quindi, in breve: no, le specifiche non dicono nulla sullo stack e sull'heap. È perfettamente possibile implementare Java con solo uno stack ridimensionabile in modo dinamico ed è perfettamente possibile implementare Java con un solo heap. Ovviamente, è necessario conservare alcune informazioni sul grafico delle chiamate, cosa che si può fare molto bene ad esempio in uno "stack" implementato come elenco collegato di frame stack allocati su heap.

    
risposta data 31.01.2016 - 11:44
fonte

Leggi altre domande sui tag