我有一个Java应用程序(比如X),其性能(运行应用程序所用的时间)必须与指定的VM Arguments一起记录在文本文件中。我的应用程序的性能会随着我们更改最大堆大小而有所不同。 因此,我的要求是使用一组VM参数(比如Xmx50M)从另一个程序(java或python或shell脚本)启动应用程序X,执行操作,记录时间,关闭它然后执行相同的一组具有不同VM参数的操作。我必须多次为多个VM参数执行此操作。 我不知道怎么能这样做。 我在这里阅读了各种各样的主题和博客,但是找不到任何可以让我关闭然后用不同的VM参数重启应用程序的东西。 我也试过使用关机钩子,但这没有用。我想我在使用中做错了。
public static void restartApplication() throws IOException {
try {
String java = System.getProperty("java.home") + "/bin/java";
List<String> vmArguments = ManagementFactory.getRuntimeMXBean()
.getInputArguments();
StringBuffer vmArgsOneLine = new StringBuffer();
for (String arg : vmArguments) {
if (!arg.contains("-agentlib")) {
vmArgsOneLine.append(arg);
vmArgsOneLine.append(" ");
}
}
final StringBuffer cmd = new StringBuffer("\"" + java + "\" "
+ vmArgsOneLine);
String[] mainCommand = System.getProperty("sun.java.command")
.split(" ");
if (mainCommand[0].endsWith(".jar")) {
cmd.append("-jar " + new File(mainCommand[0]).getPath());
} else {
cmd.append("-cp \"" + System.getProperty("java.class.path")
+ "\" " + mainCommand[0]);
}
for (int i = 1; i < mainCommand.length; i++) {
cmd.append(" ");
cmd.append(mainCommand[i]);
}
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
Runtime.getRuntime().exec(cmd.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
});
System.exit(0);
} catch (Exception e) {
throw new IOException(
"Error while trying to restart the application", e);
}