web-dev-qa-db-fra.com

Comment obtenir des arguments vm depuis une application Java?

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

Pour être plus précis:
Je dois créer un thread spécifique avec une taille de pile native supérieure à celle par défaut, mais au cas où l’utilisateur voudrait s’occuper de ces choses lui-même en spécifiant l’option -Xss, je souhaite créer tous les threads avec la taille de pile par défaut sera spécifié par l'utilisateur dans l'option -Xss). 

J'ai vérifié des classes comme Java.lang.System et Java.lang.Runtime, mais elles ne me donnent pas d'informations sur vmargs

Est-il possible d'obtenir les informations dont j'ai besoin?

141
okutane

Avec ce code, vous pouvez obtenir les arguments de la machine virtuelle Java:

import Java.lang.management.ManagementFactory;
import Java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
159
David Schuler

Au démarrage, transmettez ce -Dname=value

puis dans votre code, vous devriez utiliser

value=System.getProperty("name");

pour obtenir cette valeur

173
Java_Freak

J'ai trouvé que HotSpot répertorie tous les arguments VM dans le bean de gestion, à l'exception de -client et -server. Ainsi, si vous déduisez l'argument -client/-server à partir du nom VM et que vous l'ajoutez à la liste du bean de gestion à 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 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();
  }
}

Pourrait être raccourci si vous voulez les arguments dans un List<String>.

Note finale: Nous pourrions également vouloir étendre cette option pour gérer le cas rare d’espaces dans les arguments de ligne de commande.

3
Stefan Reich

Je n'ai pas essayé d'obtenir spécifiquement les paramètres VM, mais les utilitaires JMX, notamment les utilitaires MXBean, contiennent une mine d'informations. Ce serait par où je commencerais. J'espère que vous trouverez quelque chose pour vous aider.

Le site Web de Sun contient de nombreuses informations sur la technologie:

http://Java.Sun.com/javase/6/docs/technotes/guides/management/mxbeans.html

2
reccles

Si vous voulez toute la ligne de commande de votre processus Java, vous pouvez utiliser: JvmArguments.Java (Utilise une combinaison de JNA +/proc pour couvrir la plupart des implémentations Unix)

0
user2179737