2009-12-02 2 views
8

Sun's JVM è disponibile in due versioni: -client e -server, in cui si suppone che la Server VM sia ottimizzata per processi a esecuzione prolungata ed è consigliata per le applicazioni server.Come assicurarsi che sto usando la JVM "server"?

Quando eseguo java senza parametri, visualizza le opzioni di utilizzo, che include il seguente testo:

 
    The default VM is server, 
    because you are running on a server-class machine. 

Dopo aver visto questo, non mi preoccupai di aggiungere il -server al comando di avvio del processo.

Tuttavia, in una recente crash log JVM, ho notato la seguente riga vicino alla fine del file:

 
vm_info: Java HotSpot(TM) Client VM (14.0-b16) for linux-x86 JRE (1.6.0_14-b08), built on May 21 2009 02:01:47 by "java_re" with gcc 3.2.1-7a (J2SE release) 

Mi sembra che Java utilizza il client VM, nonostante ciò che si dice nella messaggio di aiuto. Aggiungerò l'opzione -server al mio comando di avvio, ma ora sono sospettoso. Quindi la mia domanda è: c'è un modo per assicurarmi che la VM in cui sto girando sia davvero la Server VM, senza ricorrere a forzare un crash JVM?

Il sistema operativo è ubuntu 8.04, ma sto utilizzando JDK 1.6.0_14 che ho scaricato dal sito Web di Sun.

+0

A modo, sono consapevole che la domanda sembra più appropriata per ServerFault, ma mi aspetto che la risposta sia poche righe di codice java, quindi sembra che i programmatori abbiano maggiori possibilità di risposta. – itsadok

+0

Sento la necessità di far notare che solo perché l'esecuzione di "java" senza argomenti sta utilizzando la VM del server, ciò non garantisce che qualunque script/comando avvii il processo che si è arrestato non specifica la VM del client come argomento. –

risposta

11

Si può fare

System.out.println(System.getProperty("java.vm.name")); 

Quali sulle mie dichiarazioni macchina sia:

Java HotSpot (TM) Cliente VM

o

Java HotSpot (TM) VM server a 64 bit

Naturalmente non si deve fare nulla critica sulla base di questo valore, in quanto probabilmente cambierà in futuro, e sarà completamente diverso su un altro JVM.

+0

Quando è in esecuzione come server, l'output è "VM server Java HotSpot (TM) a 64 bit". Questo è un grande contributo alla mia stessa domanda (che dovrebbe essere interessante per chiunque si chieda quali informazioni siano disponibili come proprietà di sistema): http://stackoverflow.com/questions/1803075/complete-list-of-available-java-system- proprietà-e-valori noti – sfussenegger

+0

Può anche dire "Java HotSpot (TM) Server VM". Inoltre, diverse VM possono restituire stringhe diverse. – Bombe

9

Ho avuto una domanda molto simile which I asked on ServerFault. Direi, se ti interessa quale versione viene eseguita, usa sempre -client o -server.

1

Bene, se si avvia esplicitamente con il prompt della riga di comando -server, si sta eseguendo in modalità server. È possibile verificare che con questo:

ManagementFactory.getRuntimeMXBean().getInputArguments(); 

Potete guardare RuntimeMXBean che possono aprirsi più informazioni, ma che avrebbe dovuto essere testato su JVM specifica in esecuzione.

+0

Questo comando non elenca l'argomento "-server" (solo tutti gli altri argomenti). –

1

Senza scrivere alcuna riga di codice, se si utilizza JConsole per connettersi alla JVM, nella scheda 'Riepilogo VM', dovrebbe indicare esattamente quale macchina virtuale (server o client) viene monitorata.

Per esempio,

Virtual Machine: OpenJDK Server VM version 1.6.0-b09

di monitorare a distanza il vostro JVM utilizzando JConsole, è sufficiente attivare il JMX (Java Management Extensions) agente partendo JVM con le seguenti proprietà del sistema

> java.rmi.server.hostname=[your server IP/Name] // without this, on linux, jconsole will fail to connect to the remote server where JVM is running 
> com.sun.management.jmxremote.authenticate=false 
> com.sun.management.jmxremote.ssl=false 
> com.sun.management.jmxremote.port=[portNum]