192 votes

Comment obtenir les arguments VM à l'intérieur d'une application Java ?

J'ai besoin de vérifier si une option qui peut être passée à la JVM est explicitement définie ou a sa valeur par défaut.

Pour être plus précis : J'ai besoin de créer un thread spécifique avec une taille de pile native plus élevée que celle par défaut, mais au cas où l'utilisateur voudrait s'occuper lui-même de ce genre de choses en spécifiant l'attribut -Xss Je veux créer tous les threads avec une taille de pile par défaut (qui sera spécifiée par l'utilisateur dans l'option -Xss).

J'ai vérifié des classes comme java.lang.System y java.lang.Runtime mais ils ne me donnent aucune information utile sur les arguments de VM.

Y a-t-il un moyen d'obtenir les informations dont j'ai besoin ?

230voto

Java_Freak Points 455

Au démarrage, passez cette -Dname=value

et ensuite dans votre code vous devez utiliser

value=System.getProperty("name");

pour obtenir cette valeur

6 votes

Je ne peux pas l'utiliser pour obtenir -Xdebug

39 votes

Je ne sais pas pourquoi cette réponse a été autant votée, cela ne récupère que les paramètres de l'application (spécifiés avec -D), pas les paramètres de la VM (ceux spécifiés avec -X). La question porte spécifiquement sur les paramètres -X.

11 votes

Je suis venu ici parce que je croyais que les paramètres de type -Dname=value sont des arguments JVM et qu'il n'y a pas de différence intrinsèque à -X arguments. En fait, ils sont tous deux passés à java et non à l'application à la ligne de commande et, comme le prouve l'exemple, dans maven, vous pouvez passer les deux en tant que -Drun.jvmArguments=... . Je crois que c'est pour cela qu'il est upvoted.

225voto

David Schuler Points 836

Avec ce code, vous pouvez obtenir les arguments de la JVM :

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

0 votes

Malheureusement, vous ne pouvez pas obtenir le nom de la classe principale s'il est donné sur la ligne de commande.

0 votes

@Daniel, cela devrait vous permettre d'obtenir le nom de la classe principale : final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); final String mainClassName = stackTrace[stackTrace.length - 1].getClassName());

4 votes

Si vous êtes sûr de fonctionner sur la JVM d'Oracle et que vous avez le code pour analyser les arguments, cela peut être utile.

7voto

Stefan Reich Points 71

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

Il pourrait être plus court si vous voulez les arguments dans une List<String> .

Note finale : Nous pourrions également vouloir étendre ce système pour gérer le cas rare d'avoir des espaces dans les arguments de la ligne de commande.

3voto

reccles Points 2282

Je n'ai pas essayé de récupérer spécifiquement les paramètres de la VM, mais il existe une mine d'informations dans les utilitaires JMX, notamment les utilitaires MXBean. C'est par là que je commencerais. J'espère que vous y trouverez quelque chose qui vous aidera.

Le site web du soleil a beaucoup d'informations sur la technologie :

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

2voto

user2179737 Points 11

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X