У меня есть приложение Java (скажем, X), производительность которого (время, затраченное на запуск приложения) должно быть зарегистрировано в текстовом файле вместе с указанными аргументами виртуальной машины. Производительность моего приложения будет меняться по мере изменения максимального размера кучи. Итак, мое требование состоит в том, чтобы запустить приложение X из другой программы (java, python или сценария оболочки) с одним набором аргументов VM (скажем, Xmx50M), выполнить операции, зарегистрировать время, закрыть его, а затем выполнить тот же набор операции с другим аргументом 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);
}