Esiste una JVM per applicazione Java?


91

La stessa JVM utilizzata da tutte le applicazioni Java in esecuzione o si applica "una JVM per applicazione Java"? (supponiamo che le applicazioni siano IntelliJ IDEA, un server e NetBeans per esempio)

Inoltre, esiste una connessione tra le JVM assegnate e i processi utilizzati da ciascuna applicazione Java?


2
Questa è un'ottima domanda. :)
jamie

Risposte:


81

In generale, ogni applicazione riceverà la propria istanza JVM e il proprio processo a livello di sistema operativo e ogni istanza JVM è indipendente l'una dall'altra.

Ci sono alcuni dettagli di implementazione come Condivisione dati di classe , in cui più istanze JVM potrebbero condividere alcuni dati / memoria ma non hanno alcun effetto visibile all'utente per le applicazioni (ad eccezione del tempo di avvio migliorato, si spera).

Uno scenario comune, tuttavia, è un singolo server delle applicazioni (o "server web") come Glassfish o Tomcat che esegue più applicazioni web. In questo caso, più applicazioni Web possono condividere una JVM.


21

C'è una JVM per applicazione Java. Non dovrebbe esserci alcuna connessione tra di loro a meno che non ne venga stabilita una, ad esempio con la rete. Se stai lavorando all'interno di un IDE, il codice che scrivi generalmente viene eseguito in una JVM separata. L'IDE normalmente connetterà la JVM separata per il debug. Se hai a che fare con più applicazioni web, queste potrebbero condividere la stessa JVM se vengono distribuite nello stesso contenitore web.


12

In teoria è possibile eseguire più applicazioni in una JVM. In pratica, possono interferire tra loro in vari modi. Ad esempio :

  • La JVM ha una serie di System.in/ out/ err, una codifica predefinita, una locale predefinita, una serie di proprietà di sistema e così via. Se un'applicazione li modifica, influisce su tutte le applicazioni.
  • Qualsiasi applicazione che chiama System.exit()uccide tutte le applicazioni.
  • Se un thread dell'applicazione si guasta e consuma troppa CPU o memoria, influirà anche sulle altre applicazioni.

8

Il numero di JVM in esecuzione è il numero di eseguibili richiamati. Ciascuna di queste applicazioni richiama il proprio eseguibile java (java.exe / javaw.exe etx per Windows), il che significa che ognuna è in esecuzione in una JVM separata.


8

Risposta breve: spesso, sì, riceverai un'applicazione per JVM. Risposta lunga: la JVM può essere utilizzata in questo modo, e questa potrebbe essere l'opzione migliore, ma non deve esserlo.

Tutto dipende da ciò che consideri una "applicazione". Un IDE è un buon esempio di un'applicazione che viene presentata ai suoi utenti finali (cioè noi) come una singola entità ma che in realtà è composta da più applicazioni sottostanti (compilatori, test runner, strumenti di analisi statica, pacchetti, gestori di pacchetti, progetti / strumenti di gestione delle dipendenze, ecc.). In tal caso ci sono una varietà di trucchi che l'IDE utilizza per garantire che l'utente sperimenta un'esperienza integrata pur essendo al contempo protetto (in una certa misura) dai singoli capricci degli strumenti sottostanti. Uno di questi trucchi consiste nell'eseguire alcune cose in una JVM separata, comunicando tramite file di testo o tramite le funzionalità di debug a livello di applicazione.

I server delle applicazioni (Wildfly, Glassfish, Websphere, Weblogic, ecc.) Sono applicazioni la cui ragion d'essere è agire come contenitori per l'esecuzione di altre applicazioni. In tal caso, da un punto di vista, esiste un'unica JVM per applicazione (ovvero una JVM viene utilizzato per eseguire l'intero server delle applicazioni) ma in realtà ci sono più applicazioni contenute all'interno di quella JVM a sé stanti, ciascuna logicamente separata l'una dall'altra nel proprio classloader (riducendo la possibilità di crosstalk accidentale durante il processo).

Quindi, tutto dipende davvero da ciò che consideri applicationessere. Se stai semplicemente parlando di "la cosa che viene eseguita quando viene chiamato 'main ()'", allora stai guardando un'applicazione per JVM: quando il sistema operativo avvia la JVM, la JVM esegue il public static void main()metodo di una singola classe .

Ma una volta che le tue applicazioni iniziano a diventare più complicate, i tuoi confini diventano più sfumati. Un IDE come Intellij o Eclipse riutilizzerà gran parte delle stesse cose di "javac", nella stessa JVM o in una diversa, oltre a svolgere un lavoro diverso (come ridipingere lo schermo). E gli utenti di un'applicazione Web su un server di applicazioni (JVM condivisa) potrebbero effettivamente utilizzare più o meno la stessa applicazione "principale" che potrebbe essere utilizzata localmente tramite la riga di comando.


5

Qualsiasi applicazione che dispone di librerie condivise condividerà la stessa copia di tali librerie. Java ha una discreta quantità di librerie condivise. Tuttavia, non noterai la differenza tranne che per un po 'di memoria salvata.


2

Un po 'tardi qui, tuttavia, queste informazioni potrebbero essere utili per qualcuno. In un sistema Linux, se vuoi sapere quante JVM sono in esecuzione puoi provare questo comando

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

psper elencare il processo, grepper cercare il processo contenente "java" e wcper contare le righe restituite


0

In realtà questa è una domanda che può avere risposte molto confuse. Per mantenerlo davvero breve:

  1. Sì per processo Java, per JVM.
  2. Runtime e ProcessBuilder seguono questa regola.
  3. Il caricamento di jar utilizzando la riflessione e quindi l'esecuzione del main non genererà una nuova JVM.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.