2gb - ¿Cómo obtener argumentos vm desde el interior de la aplicación java?
optifine jvm arguments (5)
Al inicio, pase este -Dname=value
y luego en tu código debes usar
value=System.getProperty("name");
para obtener ese valor
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 especifico:
Necesito crear un hilo específico con un tamaño de pila nativo más alto que el predeterminado, pero en caso de que el usuario quiera ocuparse de tales cosas por sí mismo al especificar la opción -Xss
, quiero crear todos los hilos con el tamaño de pila predeterminado (que será especificado por el usuario en la opción -Xss).
He revisado clases como java.lang.System
y java.lang.Runtime
, pero estas no me proporcionan información sobre vmargs
.
¿Hay alguna forma de obtener la información que necesito?
Con este código puedes obtener los argumentos de JVM:
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
Descubrí que HotSpot enumera todos los argumentos de VM en el bean de administración, excepto para -client y -server. Por lo tanto, si deduce el argumento -client / -server del nombre de la máquina virtual y lo agrega a la lista del bean de gestión del tiempo de ejecución, obtendrá la lista completa de argumentos.
Aquí está el 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 hacerse más corto si quiere los argumentos en una List<String>
.
Nota final: también es posible que deseemos extender esto para manejar el raro caso de tener espacios dentro de los argumentos de la línea de comando.
No he intentado específicamente obtener la configuración de VM, pero hay una gran cantidad de información en las utilidades JMX, específicamente las utilidades MXBean. Aquí sería donde comenzaría. Espero que encuentres algo allí para ayudarte.
El sitio web Sun tiene un montón de tecnología:
http://java.sun.com/javase/6/docs/technotes/guides/management/mxbeans.html
Si quieres toda la línea de comandos de tu proceso java, puedes usar: JvmArguments.java (usa una combinación de JNA + / proc para cubrir la mayoría de las implementaciones de Unix)