我需要检查是否已明确设置了可以传递给JVM的某些选项,或者其具有默认值。
更具体地说:我需要创建一个具有比默认线程更高的本机堆栈大小的特定线程,但是如果用户希望通过指定-Xss
选项自己处理此类事情,则希望创建所有具有默认堆栈大小的线程(这将由用户在-Xss选项中指定)。
我已经检查了诸如java.lang.System
和java.lang.Runtime
之类的类,但它们并未向我提供有关VM参数的任何有用信息。
有没有办法获取我需要的信息?
我需要检查是否已明确设置了可以传递给JVM的某些选项,或者其具有默认值。
更具体地说:我需要创建一个具有比默认线程更高的本机堆栈大小的特定线程,但是如果用户希望通过指定-Xss
选项自己处理此类事情,则希望创建所有具有默认堆栈大小的线程(这将由用户在-Xss选项中指定)。
我已经检查了诸如java.lang.System
和java.lang.Runtime
之类的类,但它们并未向我提供有关VM参数的任何有用信息。
有没有办法获取我需要的信息?
在启动时传递这个参数 -Dname=value
然后在你的代码中应该使用:
value=System.getProperty("name");
获取该值
使用此代码,您可以获取JVM参数:
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
final String mainClassName = stackTrace[stackTrace.length - 1].getClassName());
- lazimport 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>
的形式呈现,可以缩短代码。
最后需要注意的是:我们可能还需要扩展此功能以处理命令行参数中包含空格的罕见情况。
http://java.sun.com/javase/6/docs/technotes/guides/management/mxbeans.html
-Dname=value
类型的参数是 JVM 参数,与-X
参数没有本质区别。实际上,它们都被传递给 java,而不是应用程序在命令行中,例如,在 maven 中,你可以将它们作为-Drun.jvmArguments=...
传递。我相信这就是为什么它会得到赞同的原因。 - kap