Comment obtenir des arguments vm depuis l’intérieur de l’application Java?

Je dois vérifier si une option pouvant être transmise à JVM est explicitement définie ou a sa valeur par défaut.

Pour être plus précis:
Je dois créer un thread spécifique avec une taille de stack native supérieure à celle par défaut, mais si l’utilisateur souhaite prendre en charge de telles -Xss spécifiant l’option -Xss , je souhaite créer tous les threads avec la taille de stack par défaut (qui sera spécifié par l’utilisateur dans l’option -Xss).

J’ai vérifié les classes comme java.lang.System et java.lang.Runtime , mais celles-ci ne me donnent pas d’informations sur les vmargs .

Est-il possible d’obtenir des informations dont j’ai besoin?

Avec ce code, vous pouvez obtenir les arguments JVM:

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

Au démarrage, passez ce -Dname=value

et puis dans votre code, vous devriez utiliser

 value=System.getProperty("name"); 

pour obtenir cette valeur

Je n’ai pas essayé spécifiquement d’obtenir les parameters de la VM, mais les utilitaires JMX contiennent de nombreuses informations, en particulier les utilitaires MXBean. Ce serait là que je commencerais. J’espère que vous y trouverez quelque chose pour vous aider.

Le site Web de Sun a un tas de technologies:

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

J’ai constaté que HotSpot répertorie tous les arguments de la machine virtuelle dans le bean de gestion, sauf pour -client et -server. Ainsi, si vous déduisez l’argument -client / -server du nom de la machine virtuelle et l’ajoutez à la liste du bean de gestion de l’exécution, vous obtenez la liste complète des arguments.

Voici le SSCCE:

 import java.util.*; import java.lang.management.ManagementFactory; class main { public static void main(final Ssortingng[] args) { System.out.println(fullVMArguments()); } static Ssortingng fullVMArguments() { Ssortingng name = javaVmName(); return (contains(name, "Server") ? "-server " : contains(name, "Client") ? "-client " : "") + joinWithSpace(vmArguments()); } static List vmArguments() { return ManagementFactory.getRuntimeMXBean().getInputArguments(); } static boolean contains(Ssortingng s, Ssortingng b) { return s != null && s.indexOf(b) >= 0; } static Ssortingng javaVmName() { return System.getProperty("java.vm.name"); } static Ssortingng joinWithSpace(Collection c) { return join(" ", c); } public static Ssortingng join(Ssortingng glue, Iterable ssortingngs) { if (ssortingngs == null) return ""; SsortingngBuilder buf = new SsortingngBuilder(); Iterator i = ssortingngs.iterator(); if (i.hasNext()) { buf.append(i.next()); while (i.hasNext()) buf.append(glue).append(i.next()); } return buf.toSsortingng(); } } 

Peut être raccourci si vous voulez les arguments dans une List .

Note finale: Nous pourrions aussi vouloir étendre ceci pour gérer le cas rare d’avoir des espaces dans les arguments de la ligne de commande.

Si vous voulez la ligne de commande complète de votre processus Java, vous pouvez utiliser: JvmArguments.java (utilise une combinaison de JNA + / proc pour couvrir la plupart des implémentations unix)