Как получить аргументы VM изнутри Java-приложения?
Мне нужно проверить, явно ли установлена какая-либо опция, которая может быть передана в JVM, или имеет значение по умолчанию.
Чтобы быть более конкретным: мне нужно создать один конкретный поток с более высоким собственным размером стека, чем по умолчанию, но в случае, если пользователь хочет сам позаботиться о таких вещах, указав -Xss
я хочу создать все потоки с размер стека по умолчанию (который будет указан пользователем в опции -Xss).
Я проверил классы, такие как java.lang.System
и java.lang.Runtime
, но они не дают мне никакой полезной информации об аргументах VM.
Есть ли способ получить нужную мне информацию?
Ответы
Ответ 1
С помощью этого кода вы можете получить аргументы JVM:
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
Ответ 2
При запуске пройдите этот -Dname=value
а затем в вашем коде вы должны использовать
value=System.getProperty("name");
чтобы получить это значение
Ответ 3
Я обнаружил, что HotSpot перечисляет все аргументы VM в bean-компоненте управления, кроме -client и -server. Таким образом, если вы выводите аргумент -client / -server из имени виртуальной машины и добавляете его в список bean-компонентов управления во время выполнения, вы получаете полный список аргументов.
Вот 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();
}
}
Можно сделать короче, если вы хотите, чтобы аргументы в List<String>
.
Последнее замечание: мы могли бы также расширить это, чтобы обработать редкий случай наличия пробелов в аргументах командной строки.
Ответ 4
Я не пробовал специально получать настройки виртуальной машины, но в утилях JMX имеется множество сведений об утилитах MXBean. Это было бы, где я начну. Надеюсь, вы найдете что-то там, чтобы помочь вам.
На веб-сайте Sun есть своя технология:
http://java.sun.com/javase/6/docs/technotes/guides/management/mxbeans.html
Ответ 5
Если вам нужна вся командная строка вашего Java-процесса, вы можете использовать: JvmArguments.java
(использует комбинацию JNA +/proc для покрытия большинства реализаций unix)