Программное закрытие приложения Java и его повторный перезапуск с другими аргументами виртуальной машины

У меня есть приложение 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);
    }

person animesh143    schedule 01.12.2015    source источник
comment
Я предлагаю вам попробовать скрипт bash. Вы захотите запустить его из скрипта и записать PID. Затем вы можете отправить ему kill (через его PID), а затем перезапустить с другими аргументами виртуальной машины.   -  person Jim Archer    schedule 01.12.2015
comment
Я думаю, вам следует подумать о добавлении обработки сигналов в ваше Java-приложение и, чтобы закрыть его, просто отправить определенный сигнал, который ваше приложение готово обработать, чтобы вызвать корректное завершение работы. Таким образом, вы можете перебрать свои аргументы, отправить сигнал программе Java, чтобы она закрылась, а затем повторно запустить новый экземпляр. Этот пост может быть полезен.   -  person code_dredd    schedule 01.12.2015
comment
Возможный дубликат Отладчик Java: возможно ли выборочно приостанавливать потоки?   -  person Paul Sweatte    schedule 15.12.2016