56 votes

Comment la pile, le tas et les threads de la JVM sont mappés à la mémoire physique ou au système d'exploitation.

Le livre du compilateur (The dragon book) explique que les types de valeur sont créés sur la pile, et les types de référence sur le tas.

Pour Java, la JVM contient également le tas et la pile dans la zone de données d'exécution. Les objets et les tableaux sont créés sur le tas, les cadres de méthode sont poussés sur la pile. Un tas est partagé par tous les threads, tandis que chaque thread a sa propre pile. Le schéma suivant illustre cette situation :

enter image description here

En savoir plus Zones de données d'exécution Java .

Ce que je ne comprends pas, c'est que, puisque la JVM est essentiellement un logiciel, comment le tas, la pile et les threads de la JVM sont-ils mappés à la machine physique ?

J'apprécierais que quelqu'un puisse comparer ces concepts entre Java et C++. Parce que Java fonctionne sur JVM, mais pas le C++.

Pour rendre cette question plus précise, je voudrais savoir ce qui suit :

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

Mise à jour : Je dessine une image pour la mémoire physique d'exécution d'un processus.
enter image description here

3 votes

La plupart des threads ne font que correspondre aux threads du système d'exploitation, auquel cas ils obtiennent leur propre pile, comme n'importe quel thread du système d'exploitation.

0 votes

@radai Super, merci pour le commentaire ! Pouvez-vous en dire plus en comparant Java et C++ ?

0 votes

Je ne connais pas bien le c++ pour faire la comparaison, je ne connais que la partie java.

39voto

Peter Lawrey Points 229686

Ce que je ne comprends pas, c'est que, puisque la JVM est essentiellement un logiciel, comment le tas, la pile et les threads de la JVM sont-ils mappés à la machine physique ?

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

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

Les piles sont allouées par la bibliothèque de threading lorsque le thread est lancé. Là encore, il s'agit d'une région continue de mémoire virtuelle qui correspond à la taille maximale de la pile. Encore une fois, on pourrait penser à

 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 fonctionne sur une JVM, mais pas le C++.

Le C++ a toujours besoin d'un environnement d'exécution et de bibliothèques pour démarrer. Essayez de supprimer votre environnement d'exécution C++ ou libc et ceux-ci ne démarreront pas.

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

Il existe une grande région de mémoire virtuelle que vous pouvez utiliser. Il n'y a pas d'image car elle ne vous dirait pas grand-chose. Imaginez un long rectangle appelé espace utilisateur.

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

Encore une fois, il n'y a pas de magie. Le tas de la JVM est une région de la mémoire, une pile de la JVM est la même qu'une pile native, ce que C+ utilise, les registres de la JVM sont les mêmes que les registres natifs, ce que C+ utilise, et les threads de la JVM sont en fait des threads natifs, ce que C+ utilise.

Je pense que vous supposez qu'il y a plus de magie ou d'obscurité qu'il n'y en a. Vous devriez plutôt supposer que la conception la plus simple, efficace et légère a été utilisée et vous ne serez pas loin du compte.

Je devrais demander comment ils sont mappés à la machine physique ?

un à un essentiellement.

0 votes

Merci beaucoup. Dans votre réponse, en disant "espace utilisateur étiqueté", voulez-vous dire étiqueté avec chaque processus ? Le thread de la JVM est mappé au noyau "un à un" ?

0 votes

Les piles des threads natifs se trouvent dans la mémoire de l'espace utilisateur du processus. Je ne sais pas ce que vous entendez par "espace JVM en tant que tel" s'il les exclut.

0 votes

Ai-je raison de dire que la mémoire du tas de jvm est allouée à partir du segment de données du processus OS qui représente jvm ? Mon hypothèse est basée sur le fait que jvm est essentiellement juste un processus, et que chaque processus a des segments de texte, de données et de pile, et que malloc() prend essentiellement un bloc de mémoire du segment de données. Est-ce que j'ai raison ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X