关闭Java应用程序并以不同的VM参数重新启动

2024-10-03 13:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Java应用程序(比如X),它的性能(运行应用程序所花费的时间)必须与指定的VM参数一起记录在一个文本文件中。当我们更改最大堆大小时,应用程序的性能会有所不同。 因此,我的要求是使用一组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);
    }

Tags: cmd应用程序new参数stringargvmjava