Come ottenere argomenti vm dall’interno dell’applicazione java?

Devo controllare se alcune opzioni che possono essere passate a JVM sono impostate in modo esplicito o hanno il valore predefinito.

Per essere più specifici:
Ho bisogno di creare un thread specifico con una dimensione dello stack nativo superiore a quella predefinita, ma nel caso in cui l’utente voglia occuparsi di queste cose da solo specificando -Xss opzione -Xss , voglio creare tutti i thread con la dimensione dello stack predefinita (che sarà specificato 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 informazioni di cui ho bisogno?

Con questo codice è ansible ottenere gli argomenti JVM:

 import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; ... RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); List arguments = runtimeMxBean.getInputArguments(); 

All’avvio passare questo -Dname=value

e poi nel tuo codice che dovresti usare

 value=System.getProperty("name"); 

per ottenere quel valore

Non ho provato in particolare a ottenere le impostazioni della VM, ma c’è una grande quantità di informazioni nei programmi di utilità JMX, in particolare le utilità MXBean. Questo sarebbe dove vorrei iniziare. Spero che tu trovi qualcosa lì per aiutarti.

Il sito web del sole ha un sacco sulla tecnologia:

http://java.sun.com/javase/6/docs/technotes/guides/management/mxbeans.html

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 il codice 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 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 c) { return join(" ", c); } public static String join(String glue, Iterable strings) { if (strings == null) return ""; StringBuilder buf = new StringBuilder(); Iterator i = strings.iterator(); if (i.hasNext()) { buf.append(i.next()); while (i.hasNext()) buf.append(glue).append(i.next()); } return buf.toString(); } } 

Potrebbe essere ridotto se si desidera che gli argomenti in un List .

Nota finale: potremmo anche voler estendere questo per gestire il raro caso di avere spazi all’interno degli argomenti della riga di comando.

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