Existe-t-il une JVM par application Java?

91

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?

nadh
la source
2
c'est une excellente question. :)
jamie

Réponses:

81

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.

Joachim Sauer
la source
21

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.

WhiteFang34
la source
12

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 JVM possède un ensemble de System.in/ out/ err, un encodage par défaut, un paramètre régional par défaut, un ensemble de propriétés système, etc. Si une application les modifie, cela affecte toutes les applications.
  • Toute application qui appelle System.exit()tue toutes les applications.
  • Si un thread d'application devient sauvage et consomme trop de CPU ou de mémoire, cela affectera également les autres applications.
Rajneesh Mishra
la source
8

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.

d-vivre
la source
8

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 la public 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.

sisyphe
la source
5

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.

Peter Lawrey
la source
2

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

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

pslister les processus, greprechercher les processus contenant "java" et wccompter les lignes renvoyées

Ram Dwivedi
la source
0

En fait, c'est une question qui peut avoir des réponses très déroutantes. Pour faire court:

  1. Oui par processus java, par JVM.
  2. Runtime et ProcessBuilder suivent cette règle.
  3. Le chargement de fichiers JAR à l'aide de la réflexion, puis l'exécution du main ne créera pas de nouvelle JVM.
asmitB
la source