La même JVM est-elle utilisée par toutes les applications Java en cours d'exécution ou est-ce que «une JVM par application Java» s'applique? (disons que les applications sont IntelliJ IDEA, un serveur et NetBeans par exemple)
En outre, existe-t-il une connexion entre les JVM affectées et les processus utilisés par chaque application Java?
Réponses:
D'une manière 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 l'une de l'autre.
Il existe certains détails d'implémentation tels que le partage de données de classe , où plusieurs instances JVM peuvent partager des données / mémoire mais celles-ci n'ont aucun effet visible par l'utilisateur sur les applications (à l'exception du temps de démarrage amélioré, espérons-le).
Un scénario courant est cependant un serveur d'applications unique (ou "serveur Web") tel que Glassfish ou Tomcat exécutant plusieurs applications Web. Dans ce cas, plusieurs applications Web peuvent partager une JVM.
la source
Il y a une JVM par application Java. Il ne devrait y avoir aucune connexion entre eux à moins que vous n'en établissiez une, par exemple avec un réseau. Si vous travaillez à l'intérieur d'un IDE, le code que vous écrivez s'exécute généralement dans une JVM distincte. L'EDI connectera généralement la JVM séparée pour le débogage. Si vous avez affaire à plusieurs applications Web, elles peuvent partager la même JVM si elles sont déployées sur le même conteneur Web.
la source
En théorie, vous pouvez exécuter plusieurs applications dans une machine virtuelle Java. En pratique, ils peuvent interférer les uns avec les autres de différentes manières. Par exemple :
la source
Le nombre de JVM en cours d'exécution correspond au nombre d'exécutables appelés. Chacune de ces applications appelle son propre exécutable Java (java.exe / javaw.exe etx pour Windows), ce qui signifie que chacune s'exécute dans une JVM distincte.
la source
Réponse courte: souvent, oui, vous obtiendrez une application par JVM. Réponse longue: la JVM peut être utilisée de cette façon, et c'est 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'application qui est présentée à ses utilisateurs finaux (c'est-à-dire nous) comme une seule entité mais qui est en fait composée de plusieurs applications sous-jacentes (compilateurs, testeurs, outils d'analyse statique, packagers, gestionnaires de packages, projet / outils de gestion des dépendances, etc.). Dans ce cas, il existe une variété d'astuces que l'EDI utilise pour s'assurer que l'utilisateur expérimente une expérience intégrée tout en étant également protégé (dans une certaine mesure) des aléas individuels des outils sous-jacents. L'une de ces astuces consiste à effectuer certaines opérations dans une JVM séparée, en communiquant soit via des fichiers texte, soit 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 de servir de conteneurs pour l'exécution d'autres applications. Dans ce cas, d'un point de vue, il y a une seule JVM par application (c'est-à-dire une JVM est utilisé pour exécuter l'ensemble du serveur d'applications), mais il existe en fait plusieurs applications contenues dans cette JVM, chacune logiquement séparée les unes des autres dans leur propre chargeur de classe (ce qui réduit le risque de diaphonie accidentelle en cours de processus).
Donc, tout dépend vraiment de ce que vous considérez
application
être. Si vous parlez purement de "la chose qui s'exécute lorsque 'main ()' est appelé", alors vous regardez une application par JVM - lorsque le système d'exploitation démarre la JVM, la JVM exécute lapublic static void main()
méthode d' une seule classe .Mais une fois que vos applications commencent à se compliquer, vos limites deviennent plus floues. Un IDE tel qu'Intellij ou Eclipse réutilisera une grande partie des mêmes éléments que «javac», que ce soit dans la même JVM ou dans une autre, et effectuera un travail différent (comme repeindre l'écran). Et les utilisateurs d'une application Web sur un serveur d'applications (JVM partagé) peuvent en fait utiliser à peu près la même application «principale» que celle qui pourrait être utilisée localement via la ligne de commande.
la source
Toute application qui a des bibliothèques partagées partagera la même copie de ces bibliothèques. Java a une bonne quantité de bibliothèques partagées. Cependant, vous ne remarquerez pas la différence, sauf pour une certaine mémoire enregistrée.
la source
Un peu tard ici, cependant, cette information peut être utile à quelqu'un. Dans un système Linux, si vous voulez savoir combien de JVM sont en cours d'exécution, vous pouvez essayer cette commande
la source
En fait, c'est une question qui peut avoir des réponses très déroutantes. Pour faire court:
la source