Existe-t-il une JVM par application Java?

La même machine virtuelle Java est-elle utilisée par toutes les applications Java en cours d’exécution ou «une machine virtuelle Java par application Java» s’applique-t-elle? (disons que les applications sont IntelliJ IDEA, un serveur et NetBeans par exemple)

En outre, existe-t-il une connexion entre les JVM atsortingbuées et les processus utilisés par chaque application Java?

En règle générale, chaque application aura sa propre instance JVM et son propre processus au niveau du système d’exploitation, et chaque instance JVM est indépendante les unes des autres.

Il y a des détails d’implémentation tels que le partage de données de classe , où plusieurs instances de JVM peuvent partager certaines données / mémoire, mais celles-ci n’ont aucun effet visible sur les applications (excepté le temps de démarrage amélioré).

Un scénario commun est toutefois un serveur d’application unique (ou “serveur Web”) tel que Glassfish ou Tomcat exécutant plusieurs applications Web. Dans ce cas, plusieurs applications Web peuvent partager une JVM.

Il y a une JVM par application Java. Il ne devrait y avoir aucun lien entre eux sauf si vous en établissez un, par exemple avec le réseau. Si vous travaillez dans un environnement de développement intégré, le code que vous écrivez s’exécute généralement dans une machine virtuelle Java distincte. L’EDI connectera généralement la JVM séparée pour le débogage. Si vous traitez avec plusieurs applications Web, elles peuvent partager la même JVM si elles sont déployées sur le même conteneur Web.

Le nombre de JVM en cours d’exécution correspond au nombre d’exécutables invoqués. Chacune de ces applications invoque son propre exécutable java (java.exe / javaw.exe etx pour Windows), ce qui signifie que chaque application s’exécute dans une machine virtuelle Java distincte.

En théorie, vous pouvez exécuter plusieurs applications dans une JVM. En pratique, ils peuvent interférer de différentes manières. Par exemple:

The JVM has one set of System.in/out/err, one default encoding, one default locale, one set of system properties, and so on. If one application changes these, it affects all applications. Any application that calls System.exit() kills all applications. If one application thread goes wild, and consumes too much CPU or memory it will affect the other applications too. 

La réfrence

Toute application ayant des bibliothèques partagées partagera la même copie de ces bibliothèques. Java a pas mal de bibliothèques partagées. Cependant, vous ne remarquerez pas la différence, à part quelques économies de mémoire.

Réponse courte: souvent, oui, vous obtiendrez une application par JVM. Réponse longue: la JVM peut être utilisée de cette manière, et cela peut être la meilleure option, mais ce n’est pas obligatoire.

Tout dépend de ce que vous considérez comme une «application». Un IDE est un bon exemple d’une application présentée à ses utilisateurs finaux (c.-à-d. Nous) en tant qu’entité unique, mais qui comprend en réalité plusieurs applications sous-jacentes (compilateurs, testeurs, outils d’parsing statique, outils de gestion des dépendances, etc.). Dans ce cas, l’EDI utilise diverses méthodes pour s’assurer que l’utilisateur bénéficie d’une expérience intégrée tout en étant protégé (dans une certaine mesure) des aléas individuels des outils sous-jacents. Une de ces astuces consiste à faire certaines choses dans une machine virtuelle Java distincte, en communiquant via des fichiers texte ou via les fonctions de débogage au niveau de l’application.

Les serveurs d’applications (Wildfly, Glassfish, Websphere, Weblogic, etc.) sont des applications dont la raison d’être est d’agir comme conteneurs pour d’autres applications. Dans ce cas, il y a une seule JVM par application (une JVM). est utilisé pour exécuter l’intégralité du serveur d’applications), mais il existe en réalité de multiples applications contenues dans cette JVM, chacune étant logiquement séparée l’une de l’autre dans son propre chargeur de classe (ce qui réduit la possibilité d’une diaphonie en cours accidentelle).

Donc, tout dépend vraiment de ce que vous considérez comme une application . Si vous ne parlez que de “la chose qui s’exécute lorsque” main () “est appelée”, alors vous examinez une application par JVM – lorsque le système d’exploitation démarre la JVM, la JVM exécute la public static void main() une seule classe. public static void main() méthode

Mais une fois que vos applications deviennent plus compliquées, vos frontières deviennent plus floues. Un IDE tel que Intellij ou Eclipse réutilisera une grande partie des mêmes fonctionnalités que «javac», soit dans la même JVM ou dans une autre, tout en effectuant des tâches différentes (comme repeindre l’écran). Et les utilisateurs d’une application Web sur un serveur d’applications (partagé par JVM) peuvent en fait utiliser la même application «principale» que celle qui pourrait être utilisée localement via la ligne de commande.

Un peu tard ici cependant cette information peut être utile pour quelqu’un. Dans un système Linux, si vous voulez savoir combien de machines virtuelles Java fonctionnent, vous pouvez essayer cette commande

 $ ps -ef | grep "[j]ava" | wc -l 

ps pour lister le processus, grep vers le processus de recherche contenant “java” et wc pour compter les lignes renvoyées