Come stack, heap e thread JVM sono mappati alla memoria fisica o al sistema operativo

Il libro del compilatore (The dragon book) spiega che i tipi di valore sono creati nello stack e che i tipi di riferimento sono creati nell’heap.

Per Java, JVM contiene anche heap e stack nell’area dei dati di runtime. Gli oggetti e gli array vengono creati nell’heap, i frame dei metodi vengono inseriti nello stack. Un heap è condiviso da tutti i thread, mentre ogni thread ha il proprio stack. Il seguente diagramma mostra questo:

inserisci la descrizione dell'immagine qui

Ulteriori informazioni sulle aree dati di run-time di Java .

Quello che non capisco è che dal momento che JVM è essenzialmente un software, in che modo questi heap, stack e thread JVM sono mappati sulla macchina fisica?

Lo apprezzerei se qualcuno potesse confrontare questi concetti tra Java e C ++. Perché Java gira su JVM, ma C ++ no.

Per rendere questa domanda più precisa, voglio sapere quanto segue:

  1. Confronto con Java, come appare l’area dati di runtime di C ++? Un’immagine sarebbe utile, non riesco a trovare una buona immagine come quella JVM sopra.
  2. In che modo l’heap, lo stack, i registri e i thread JVM sono mappati al sistema operativo? o dovrei chiedere come sono mappati alla macchina fisica?
  3. È vero che ogni thread JVM è semplicemente un thread utente e in qualche modo viene mappato a kernal? (thread utente vs thread del kernel)

Aggiornamento : disegno un’immagine per la memoria fisica di runtime di un processo.
inserisci la descrizione dell'immagine qui

Quello che non capisco è che dal momento che JVM è essenzialmente un software, in che modo questi heap, stack e thread JVM sono mappati sulla macchina fisica?

L’heap è un’area continua pre-allocata di memoria virtuale. per esempio

void* heap = malloc(Xmx); // get the maximum size. 

Gli stack vengono allocati dalla libreria di threading all’avvio del thread. Ancora una volta è una regione continua di memoria virtuale che è la dimensione massima dello stack. Ancora una volta potresti pensarlo come

  void* stack = malloc(Xss); // get the maximum stack size. 

I thread nativi sono funzionalità del sistema operativo che non fanno parte dello spazio JVM in quanto tale.

Perché Java gira su JVM, ma C ++ no.

C ++ ha ancora bisogno di un ambiente runtime e di librerie da avviare. Prova a eliminare C ++ Runtime o libc e questi non verranno avviati.

Confronto con Java, come appare l’area dati di runtime di C ++?

C’è una vasta area di memoria virtuale che puoi usare. Non c’è un’immagine perché non ti direbbe molto. Immagina un rettangolo lungo etichettato come spazio utente.

In che modo l’heap, lo stack, i registri e i thread JVM sono mappati al sistema operativo? o dovrei chiedere come sono mappati alla macchina fisica?

Ancora una volta non c’è magia. L’heap JVM è un’area di memoria, uno stack JVM è lo stesso stack nativo utilizzato da C +, i registri JVM sono gli stessi dei registri nativi, ovvero ciò che C + utilizza e il thread JVM sono in realtà thread nativi che è ciò che usa C + .

Penso che tu stia partendo dal presupposto che ci sia più magia o oscurità in corso rispetto a quello che c’è. Invece dovresti pensare che sia stato usato il design più semplice, efficiente e leggero e non sarai lontano.

Dovrei chiedere come sono mappati alla macchina fisica?

fondamentalmente uno a uno.

JVM (Java Virtual Machine) funge da motore di runtime per l’esecuzione di applicazioni Java. JVM è quello che effettivamente chiama il metodo principale presente in un codice java. JVM fa parte di JRE (Java Run Environment).

Le applicazioni Java sono chiamate WORA (Write Once Run Anywhere). Ciò significa che un programmatore può sviluppare codice Java su un sistema e può aspettarsi che funzioni su qualsiasi altro sistema abilitato Java senza alcuna regolazione. Tutto questo è ansible grazie a JVM. Quando compiliamo un file .java, un file .class (contiene codice byte) con lo stesso nome file è generato dal compilatore Java. Questo file .class va in vari passaggi quando lo eseguiamo. Questi passaggi insieme descrivono l’intera JVM.

Memoria JVM