¿Cómo obtener argumentos de vm desde dentro de la aplicación java?


Necesito comprobar si alguna opción que se puede pasar a JVM está explícitamente establecida o tiene su valor predeterminado.

Para ser más específicos:
Necesito crear un subproceso específico con un tamaño de pila nativo más alto que el predeterminado, pero en caso de que el usuario quiera encargarse de tales cosas por sí mismo especificando la opción -Xss Quiero crear todos los subprocesos con el tamaño de pila predeterminado (que será especificado por el usuario en la opción-Xss).

He comprobado clases como java.lang.System y java.lang.Runtime, pero estos no me están dando información sobre vmargs.

¿Hay alguna manera de obtener la información que necesito?

Author: Oscar Pérez, 2009-09-29

5 answers

Con este código puede obtener los argumentos JVM:

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
 154
Author: David Schuler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-11 14:19:15

Al iniciar pasa esto -Dname=value

Y luego en su código debe usar

value=System.getProperty("name");

Para obtener ese valor

 163
Author: Java_Freak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-26 11:53:37

No he intentado obtener específicamente la configuración de la VM, pero hay una gran cantidad de información en las utilidades JMX específicamente las utilidades MXBean. Aquí sería donde empezaría. Espero que encuentres algo que te ayude.

El sitio web de sun tiene un montón de tecnología:

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

 2
Author: reccles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-02 03:02:41

He encontrado que HotSpot enumera todos los argumentos de VM en el bean de administración, excepto para-client y-server. Por lo tanto, si infiere el argumento-client/-server del nombre de la máquina virtual y lo agrega a la lista de runtime management bean, obtendrá la lista completa de argumentos.

Aquí está la 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();
  }
}

Podría acortarse si desea los argumentos en un List<String>.

Nota final: Es posible que también queramos extender esto para manejar el raro caso de tener espacios dentro de la línea de comandos argumento.

 2
Author: Stefan Reich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-15 10:12:44

Si desea toda la línea de comandos de su proceso java, puede usar: JvmArguments.java (utiliza una combinación de JNA + /proc para cubrir la mayoría de las implementaciones de unix)

 0
Author: user2179737,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-20 14:02:13