2009-09-29 13 views
128

Muszę sprawdzić, czy niektóre opcje, które można przekazać do JVM, są jawnie ustawione lub mają ich domyślną wartość.Jak uzyskać argumenty vm z wnętrza aplikacji java?

Aby być bardziej konkretne:
muszę utworzyć jeden konkretny wątek z wyższej natywnej wielkości stosu niż domyślny, ale w przypadku, gdy użytkownik chce dbać o takie rzeczy samemu określając -Xss opcję Chcę utworzyć wszystkie wątki z domyślnym rozmiarem stosu (który będzie określony przez użytkownika w opcji -Xss).

Sprawdziłem klasy takie jak java.lang.System i java.lang.Runtime, ale nie podają one informacji o vmargs.

Czy istnieje jakiś sposób uzyskania potrzebnych informacji?

Odpowiedz

144

z tym kodem można uzyskać argumenty JVM:

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

Niestety nie można uzyskać nazwy głównej klasy, jeśli podano ją w wierszu poleceń. – Daniel

+0

@Daniel, to powinno ci nadać nazwę głównej klasy: 'final StackTraceElement [] stackTrace = Thread.currentThread(). GetStackTrace();' 'final String mainClassName = stackTrace [stackTrace.length - 1] .getClassName()); ' – laz

+7

@laz System.getProperty (" sun.java.command ") jest znacznie prostszy. – Vulcan

150

Na starcie przekazać tę -Dname=value

i następnie w swoim kodzie powinieneś użyć

value=System.getProperty("name"); 

aby ta wartość

+3

Nie mogę tego użyć, aby uzyskać -Xdebug – okwap

+6

Nie wiem, dlaczego ta odpowiedź została zmieniona, tylko pobiera parametry aplikacji (określone za pomocą -D), a nie parametry maszyn wirtualnych (te określone za pomocą -X). Pytanie dotyczy w szczególności parametrów -X. – cleberz

+2

Przyszedłem tutaj, ponieważ uważałem, że parametry typu '-Dname = value' są argumentami JVM i że nie ma żadnej wewnętrznej różnicy względem argumentów" -X ". W rzeczywistości oba są przekazywane do java, a nie do aplikacji na linii poleceń i jako dowód na przykład, w maven można przekazać oba jako '-Drun.jvmArguments = ...". Uważam, że właśnie dlatego została przegłosowana. – kap

0

Jeśli chcesz całą linię poleceń swojego procesu java, można użyć: JvmArguments.java (używa kombinacji JNA +/proc do pokrycia większości implementacji UNIX)

1

Zauważyłem, że HotSpot zawiera listę wszystkich argumentów VM w komponencie bean zarządzania, z wyjątkiem -client i -server. Tak więc, jeśli wnioskujesz o argument -client/-server z nazwy maszyny wirtualnej i dodajesz to do listy komponentów bean zarządzania runtime, otrzymujesz pełną listę argumentów.

Oto 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(); 
    } 
} 

Może być krótszy, jeśli chcesz argumentów w List<String>.

+0

Ale nadal możesz dołączyć przykład kodu. – okutane

+0

Tak, właśnie. Twoje zdrowie :) –

Powiązane problemy