以编程方式关闭Java应用程序并使用不同的VM参数重新启动它

时间:2015-12-01 05:22:20

标签: java python jvm jvm-arguments

我有一个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);
    }

0 个答案:

没有答案