Une JVM fonctionne dans un seul processus et les threads d'une JVM partagent le tas appartenant à ce processus. Alors, comment la JVM utilise-t-elle les multiples cœurs qui fournissent de multiples threads du système d'exploitation pour une concurrence élevée ?
Java utilisera les threads du système d'exploitation sous-jacent pour exécuter le code sur différents processeurs, s'il est exécuté sur une machine multi-CPU. Lorsque chaque thread Java est lancé, il crée un thread OS associé et l'OS est responsable de l'ordonnancement, etc. La JVM s'occupe de la gestion et du suivi du thread et des constructions du langage Java telles que volatile
, synchronized
, notify()
, wait()
etc. affectent tous l'état d'exécution du thread du système d'exploitation.
Une JVM fonctionne dans un seul processus et les threads d'une JVM partagent le tas appartenant à ce processus.
La JVM n'est pas nécessairement "exécutée dans un seul processus", car même le garbage collector et d'autres codes de la JVM sont exécutés dans différents threads et le système d'exploitation représente souvent ces différents threads comme des processus différents. Sous Linux, par exemple, le processus unique que vous voyez dans la liste des processus est souvent masqué par un ensemble de processus de threads différents. Ceci même si vous êtes sur une machine à un seul cœur.
Cependant, vous avez raison de dire qu'ils partagent tous le même espace de stockage. En fait, ils partagent tout le même espace mémoire, c'est-à-dire le code, les chaînes internées, l'espace de la pile, etc.
Alors, comment la JVM utilise-t-elle les cœurs multiples qui fournissent plusieurs threads de système d'exploitation pour une concurrence élevée ?
L'amélioration des performances des fils est due à plusieurs raisons. Évidemment, la concurrence directe rend souvent le programme plus rapide. La possibilité d'effectuer plusieurs tâches CPU en même temps peut (mais pas toujours) améliorer le débit de l'application. Vous pouvez également isoler les opérations d'entrée/sortie (IO) dans un seul thread, ce qui signifie que d'autres threads peuvent être exécutés pendant qu'un thread attend une IO (lecture/écriture sur le disque/réseau, etc.).
Mais en termes de mémoire, les threads obtiennent une grande partie de leurs améliorations de performance grâce à la mémoire cache locale par CPU. Lorsqu'un thread s'exécute sur un CPU, le cache mémoire local à haute vitesse du CPU aide le thread à isoler les demandes de stockage localement sans avoir à passer le temps de lire ou d'écrire dans la mémoire centrale. C'est pourquoi volatile
y synchronized
incluent des constructions de synchronisation de la mémoire, car la mémoire cache doit être vidée vers la mémoire principale ou invalidée lorsque les threads doivent coordonner leur travail ou communiquer entre eux.
6 votes
Pour autant que je sache, les threads Java sont des threads natifs de l'OS (dans la plupart des JVM). Ils n'ont rien de spécial.
5 votes
Les threads des applications natives s'exécutent également dans un seul processus et partagent une allocation de mémoire commune (et peuvent toujours utiliser plusieurs cœurs).