Comment la stack, le tas et les threads JVM sont mappés sur la mémoire physique ou le système d’exploitation

Le livre de compilation (The Dragon Book) explique que des types de valeur sont créés sur la stack et que des types de référence sont créés sur le tas.

Pour Java, JVM contient également du tas et de la stack dans la zone de données d’exécution. Les objects et les tableaux sont créés sur le tas, les frameworks de méthodes sont empilés. Un tas est partagé par tous les threads, alors que chaque thread a sa propre stack. Le diagramme suivant montre ceci:

entrer la description de l'image ici

En savoir plus sur les zones de données d’exécution Java .

Ce que je ne comprends pas, c’est que JVM étant essentiellement un logiciel, comment ces tas, stacks et threads JVM sont-ils associés à une machine physique?

J’apprécierais que quelqu’un puisse comparer ces concepts entre Java et C ++. Parce que Java s’exécute sur JVM, mais pas C ++.

Pour rendre cette question plus précise, je souhaite connaître les points suivants:

  1. En comparaison avec Java, à quoi ressemble la zone de données d’exécution C ++? Une image serait utile, je ne trouve pas une bonne image comme celle de JVM ci-dessus.
  2. Comment le tas, la stack, les registres et les threads JVM sont-ils associés au système d’exploitation? ou je devrais demander comment ils sont mappés à la machine physique?
  3. Est-il vrai que chaque thread JVM est simplement un thread utilisateur et est mappé sur kernal d’une manière ou d’une autre? (thread utilisateur vs thread kernel)

Mise à jour : je dessine une image pour la mémoire physique d’exécution d’un processus.
entrer la description de l'image ici

Ce que je ne comprends pas, c’est que JVM étant essentiellement un logiciel, comment ces tas, stacks et threads JVM sont-ils associés à une machine physique?

Le tas est une région continue de mémoire virtuelle pré-allouée. par exemple

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

Les stacks sont allouées par la bibliothèque de threads lorsque le thread est démarré. Là encore, il s’agit d’une région continue de mémoire virtuelle qui correspond à la taille maximale de la stack. Encore une fois, vous pourriez le considérer comme

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

Les threads natifs sont des fonctionnalités du système d’exploitation qui ne font pas partie de l’espace JVM en tant que tel.

Parce que Java s’exécute sur JVM, mais pas C ++.

C ++ nécessite toujours un environnement d’exécution et des bibliothèques pour démarrer. Essayez de supprimer votre C ++ Runtime ou votre libc et ceux-ci ne démarreront pas.

En comparaison avec Java, à quoi ressemble la zone de données d’exécution C ++?

Il existe une grande région de mémoire virtuelle que vous pouvez utiliser. Il n’y a pas de photo parce que ça ne vous dirait pas grand chose. Imaginez un long rectangle étiqueté espace utilisateur.

Comment le tas, la stack, les registres et les threads JVM sont-ils associés au système d’exploitation? ou je devrais demander comment ils sont mappés à la machine physique?

Là encore, il n’y a pas de magie. Le tas JVM est une région de mémoire, une stack JVM est la même que celle utilisée par C +, les registres de la JVM sont les mêmes que les registres natifs, ce qui est utilisé par C + et les machines JVM. .

Je pense que vous supposez qu’il y a plus de magie ou d’obscurité qu’il y a. Au lieu de cela, vous devez supposer que la conception la plus simple, efficace et légère a été utilisée et que vous ne serez pas loin.

Je devrais demander comment ils sont mappés sur une machine physique?

un à un essentiellement

JVM (Java Virtual Machine) agit comme un moteur d’exécution pour exécuter des applications Java. JVM est celle qui appelle la méthode principale présente dans un code Java. JVM fait partie de JRE (Java Run Environment).

Les applications Java sont appelées WORA (Write Once Run Anywhere). Cela signifie qu’un programmeur peut développer du code Java sur un système et peut s’attendre à ce qu’il s’exécute sur n’importe quel autre système compatible Java sans aucun ajustement. Tout cela est possible grâce à la JVM. Lorsque nous compilons un fichier .java, le compilateur Java génère un fichier .class (contenant le code octet) avec le même nom de fichier. Ce fichier .class passe par différentes étapes lors de son exécution. Ces étapes décrivent ensemble l’ensemble de la machine virtuelle Java.

Mémoire JVM