2009-09-29 18 views
128

Devo controllare se alcune opzioni che possono essere passate a JVM sono impostate in modo esplicito o hanno il suo valore predefinito.Come ottenere argomenti vm dall'interno dell'applicazione java?

Per essere più precisi:
Ho bisogno di creare un thread specifico con maggiore dimensione dello stack nativo quella di default, ma nel caso in cui l'utente vuole prendersi cura di queste cose da lui stesso specificando -Xss opzione Voglio creare tutti i thread con dimensioni di stack predefinite (che verranno specificate dall'utente in opzione -Xss).

Ho controllato classi come java.lang.System e java.lang.Runtime, ma queste non mi forniscono informazioni su vmargs.

C'è un modo per ottenere le informazioni di cui ho bisogno?

risposta

144

Con questo codice è possibile ottenere gli argomenti JVM:

import java.lang.management.ManagementFactory; 
import java.lang.management.RuntimeMXBean; 
... 
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); 
List<String> arguments = runtimeMxBean.getInputArguments(); 
+0

Purtroppo non è possibile ottenere il Nome della classe principale se è indicato sulla riga di comando. – Daniel

+0

@Daniel, questo dovrebbe ottenere il nome della classe principale: 'stackTraceElement finale [] stackTrace = Thread.currentThread(). GetStackTrace();' 'stringa finale mainClassName = stackTrace [stackTrace.length - 1] .getClassName()); ' – laz

+7

@laz System.getProperty (" sun.java.command ") è molto più semplice. – Vulcan

150

All'avvio passare questo -Dname=value

e quindi nel tuo codice dovresti usare

value=System.getProperty("name"); 

per ottenere quel valore

+3

Non riesco a utilizzarlo per ottenere -Xdebug – okwap

+6

Non sono sicuro del motivo per cui questa risposta è stata così potenziata, recupera solo i parametri dell'applicazione (specificati con -D), non i parametri VM (quelli specificati con -X). La domanda riguarda specificamente i parametri -X. – cleberz

+2

Sono venuto qui perché credevo che i parametri di tipo '-Dname = value' fossero argomenti JVM e che non ci fosse alcuna differenza intrinseca agli argomenti' -X'. In realtà, entrambi sono passati a java e non all'applicazione alla riga di comando e come prova per esempio, in maven puoi passare entrambi come '-Drun.jvmArguments = ...'. Credo che sia per questo che è in aumento. – kap

0

Se si desidera che l'intera riga di comando del processo Java, è possibile utilizzare: JvmArguments.java (utilizza una combinazione di JNA +/proc per coprire la maggior parte delle implementazioni UNIX)

1

Ho trovato che HotSpot elenca tutti gli argomenti VM nel bean di gestione eccetto per -client e -server. Pertanto, se si deduce l'argomento -client/-server dal nome VM e lo si aggiunge all'elenco dei bean di gestione runtime, si ottiene l'elenco completo degli argomenti.

Ecco lo SSCCE:

import java.util.*; 
import java.lang.management.ManagementFactory; 

class main { 
    public static void main(final String[] args) { 
    System.out.println(fullVMArguments()); 
    } 

    static String fullVMArguments() { 
    String name = javaVmName(); 
    return (contains(name, "Server") ? "-server " 
     : contains(name, "Client") ? "-client " : "") 
     + joinWithSpace(vmArguments()); 
    } 

    static List<String> vmArguments() { 
    return ManagementFactory.getRuntimeMXBean().getInputArguments(); 
    } 

    static boolean contains(String s, String b) { 
    return s != null && s.indexOf(b) >= 0; 
    } 

    static String javaVmName() { 
    return System.getProperty("java.vm.name"); 
    } 

    static String joinWithSpace(Collection<String> c) { 
    return join(" ", c); 
    } 

    public static String join(String glue, Iterable<String> strings) { 
    if (strings == null) return ""; 
    StringBuilder buf = new StringBuilder(); 
    Iterator<String> i = strings.iterator(); 
    if (i.hasNext()) { 
     buf.append(i.next()); 
     while (i.hasNext()) 
     buf.append(glue).append(i.next()); 
    } 
    return buf.toString(); 
    } 
} 

potrebbe essere reso più breve se si desidera che le argomentazioni in un List<String>.

+0

Ma è comunque possibile allegare un esempio di codice. – okutane

+0

Sì, l'ho fatto. Saluti :) –

Problemi correlati