Comment la pile, le tas et les threads de JVM sont mis en correspondance avec la mémoire physique ou le 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 tas, les cadres de méthode sont poussés à empiler. Un tas est partagé par tous les threads, tandis que chaque thread a sa propre pile. Le schéma suivant le montre:

enter image description here

plus d'informations sur Java run-time data areas .

ce que je ne comprends pas, c'est que puisque JVM est essentiellement un logiciel, comment ces tas JVM, stack et threads sont-ils reliés à une 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. en comparant avec Java, à quoi ressemble C++ run-time data area? Une photo serait utile, Je ne peux pas trouver une bonne photo comme celle de JVM ci-dessus.
  2. comment le tas, la pile, les registres et les threads de JVM sont-ils mis en correspondance avec le système d'exploitation? ou je devrais demander comment ils sont reliés à la machine physique?
  3. est-il vrai que chaque threads JVM est simplement un thread utilisateur et qu'il est associé au noyau d'une manière ou d'une autre? (utilisateur thread vs thread du noyau)

mise à Jour : Je dessine une image pour l'exécution mémoire physique d'un processus.

enter image description here

45
demandé sur Peter Lawrey 2013-04-28 18:53:37

2 réponses

ce que je ne comprends pas, c'est que puisque JVM est essentiellement un logiciel, comment ces tas JVM, stack et threads sont-ils reliés à une machine physique?

le tas est une région continue préaffectée de mémoire virtuelle. par exemple

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

les piles sont attribuées par la bibliothèque threading lorsque le thread est démarré. Encore une fois, c'est une région continue de mémoire virtuelle qui est la taille maximale de la pile. Encore une fois, vous

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

les threads natifs sont des fonctionnalités D'OS qui ne font pas partie de l'espace JVM en tant que tel.

parce que Java tourne sur JVM, mais pas C++.

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

la Comparaison avec Java, Qu'est-C++ données d'exécution zone regarder comme?

il y a une grande région de mémoire virtuelle que vous pouvez utiliser. Il n'y a pas de photo parce qu'elle ne vous dit pas grand chose. Imaginez un long rectangle étiqueté espace utilisateur.

comment le tas, la pile, les registres et les threads de JVM sont-ils mis en correspondance avec le système d'exploitation? ou je devrais demander comment ils sont relié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 JVM stack est la même que la pile native qui est ce que C+ utilise, les registres de JVM sont les mêmes que les registres natifs qui est ce que C+ utilise et les threads de JVM 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 le design le plus simple, efficace et léger a été utilisé et vous ne serez pas loin.

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

un à un en gros.

31
répondu Peter Lawrey 2013-04-28 17:04:29

JVM (Java Virtual Machine) agit comme un moteur d'exécution des applications Java. JVM est celui qui appelle en fait 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 à exécuter sur n'importe quel autre Java activé système sans aucun ajustement. Tout cela est possible grâce à JVM. Lorsque nous compilons un .java, un fichier .fichier de classe(contient du byte-code) avec le même nom de fichier est généré par le compilateur Java. Ce. class file va dans diverses étapes quand nous l'exécutons. Ensemble, ces étapes décrivent l'ensemble de L'ECVM.

JVM memory

2
répondu Ali Yeganeh 2018-02-25 20:49:33