web-dev-qa-db-fra.com

Existe-t-il une machine virtuelle Java par Java?

La même machine virtuelle Java est-elle utilisée par toutes les applications Java exécutées ou est-ce qu'une 'machine JVM par Java' s'applique) (par exemple, les applications sont IntelliJ IDEA, un serveur et NetBeans par exemple)

De plus, existe-t-il un lien entre les machines virtuelles Java affectées et les processus utilisés par chaque application Java?

78
nadh

De manière générale, chaque application obtiendra 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 existe certains détails d'implémentation tels que 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 (sauf pour un 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.

69
Joachim Sauer

Il y a une JVM par Java. Il ne devrait y avoir aucune connexion entre elles sauf si vous en établissez 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. Le IDE connectera généralement la JVM séparée pour le débogage. Si vous avez affaire à plusieurs applications Web, elles pourraient partager la même JVM si elles sont déployées sur le même conteneur Web .

16
WhiteFang34

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 diverses 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.

Réfraction

8
Rajneesh Mishra

Le nombre de JVM en cours d'exécution est le nombre d'exécutables invoqué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 machine virtuelle Java distincte.

8
d-live

Réponse courte: souvent, oui, vous obtiendrez une application par machine virtuelle Java. 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'une 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, analyse statique) outils, packagers, gestionnaires de packages, outils de gestion de projets/dépendances, etc.) Dans ce cas, il existe une variété d'astuces que le IDE utilise pour garantir que l'utilisateur éprouve une expérience intégrée tout en étant également à l'abri (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 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 machine virtuelle Java par application (c'est-à-dire une machine virtuelle Java) est utilisé pour exécuter l'intégralité du serveur d'applications) mais il y a en fait plusieurs applications contenues dans cette machine virtuelle Java à part entière, chacune séparée logiquement les unes des autres dans leur propre chargeur de classe (ce qui réduit la possibilité de diaphonie accidentelle en cours de processus).

Donc, tout dépend vraiment de ce que vous considérez comme un application. Si vous parlez uniquement de "la chose qui s'exécute lorsque" main () "est appelée", alors vous regardez une application par JVM - lorsque le système d'exploitation démarre la JVM, la JVM exécute la fonction public static void main() méthode.

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 choses que 'javac', soit dans la même JVM ou une autre, ainsi que pour effectuer 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 la même application "principale" que celle utilisée localement via la ligne de commande.

5
sisyphus

Toute application qui a partagé des bibliothèques 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 la mémoire enregistrée.

5
Peter Lawrey

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

ps pour lister le processus, grep pour rechercher le processus contenant "Java" et wc pour compter les lignes retournées

2
Ram Dwivedi