web-dev-qa-db-fra.com

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

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

Pour Java, JVM contient également un tas et une 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 pour s'empiler. Un tas est partagé par tous les threads, tandis que chaque thread a sa propre pile. Le diagramme suivant le montre:

enter image description here

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

Ce que je ne comprends pas, c'est que la JVM étant essentiellement un logiciel, comment ces tas, piles et threads JVM sont-ils mappés sur 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 C++.

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

  1. Par rapport à 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 la JVM ci-dessus.
  2. Comment le tas, la pile, les registres et les threads 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 JVM est simplement un thread utilisateur et est mappé au kernal d'une manière ou d'une autre? (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

51
Ryan

Ce que je ne comprends pas, c'est que la JVM étant essentiellement un logiciel, comment ces tas, piles et threads JVM sont-ils mappés sur la machine physique?

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

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

Les piles sont allouées par la bibliothèque de threads au démarrage du thread. Encore une fois, c'est une région continue de mémoire virtuelle qui est la taille de pile maximale. Encore une fois, vous pourriez y penser 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 fonctionne sur JVM, mais pas C++.

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

Par rapport à Java, à quoi ressemble la zone de données d'exécution C++?

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

Comment le tas, la pile, les registres et les threads 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 JVM est une région de mémoire, une pile JVM est la même une pile native qui est ce que C + utilise, les registres de la JVM sont les mêmes que les registres natifs qui est ce que C + utilise et le thread JVMs sont en fait des threads natifs qui est 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. 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 à la machine physique?

un à un essentiellement.

36
Peter Lawrey